P. 1
Assembling Pages Last: Edge Caching, ESI and Rails

Assembling Pages Last: Edge Caching, ESI and Rails

5.0

|Views: 3,903|Likes:
Published by Oleksiy Kovyrin

More info:

Published by: Oleksiy Kovyrin on Jun 01, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

10/12/2011

pdf

text

original

Assembling Pages Last

Edge Caching, ESI, and Rails
Aaron Batalion
5/31/2008

1

2

About Me
www.livingsocial.com blog.livingsocial.com

3

About Me
www.revolution.com

#2

http://rails100.pbwiki.com/
4

Agenda
- Examine a Rails Application - Apply Standard Caching Techniques - When thats not enough, then what? - Edge Caching - FragmentFu - Deployment Options - Pros/Cons of Edge Caching

5

Agenda
- Examine a Rails Application - Apply Standard Caching Techniques - When thats not enough, then what? - Edge Caching - FragmentFu - Deployment Options - Pros/Cons of Edge Caching

6

7

8

9

10

11

12

13

http://readers.livingsocial.com

14

def show @feed = @person.mini_feed @current = @person.currently_reading @news = Blog.recent_by_vertical(“readingsocial”) end

15

<html> <%= render <%= render <%= render <%= render </html>

:partial :partial :partial :partial

=> => => =>

"header/login" -%> "feed" -%> "current" -%> "news" -%>

16

When thats not enough, then what?

17

When thats not enough, then what?

18

When thats not enough, then what?

19

Agenda
- Examine a Rails Application - Apply Standard Caching Techniques - When thats not enough, then what? - Edge Caching - FragmentFu - Deployment Options - Pros/Cons of Edge Caching

20

class PeopleController caches_page :show ... end

21

class PeopleController caches_page :show ... end

22

class PeopleController caches_action :show ... end

23

class PeopleController caches_action :show ... end

24

<% cache(“mini-feed-#{@person.id}”) do %> <% @feed = @person.mini_feed %> <%= render :partial => "feed" -%> <% end %>

25

class Person def mini_feed cache(“feed-#{id}”) { ...} end end

26

When thats not enough, then what?

When thats not enough....

27

28

Rails isn’t fast....

It is fast enough
You can always get LOTS and LOTS of servers...

29

Use your application Without hitting your application

30

HTTP/1.1 200 OK Date: Fri, 15 Dec 2007 17:32:47 GMT Content-Length: 33286 Cache-Control: max-age=7200 Content-Type: text/html

31

HTTP/1.1 200 OK Date: Fri, 15 Dec 2007 17:32:47 GMT Content-Length: 33286 Cache-Control: max-age=7200 Content-Type: text/html

32

Agenda
- Examine a Rails Application - Apply Standard Caching Techniques - When thats not enough, then what? - Edge Caching - FragmentFu - Deployment Options - Pros/Cons of Edge Caching

33

ESI
Edge Side Includes
2001 W3C Spec http://www.w3.org/TR/esi-lang By: Akamai, Oracle, BEA, Vignette...

34

simple markup language
esi:include esi:invalidate esi:chose esi:attempt esi:try HTTP_* esi:except esi:when

35

parsed by ESI server

36

Mongrel
http://readers.livingsocial.com

ESI Server

html + esi

Mongrel

Mongrel

1. http://readers.livingsocial.com 2. Page Template

37

4 /header

(ttl = 60.min)

2
/recent (ttl = 10.min)

“Assembles”
/mini_feed (ttl = 30.min)

1

3
/news (ttl = 60.min)
38

<html>
....... .......

<esi:include src="/mini_feed” max-age="1800"/>

</html>

Mongrel
http://readers.livingsocial.com

html + esi
ESI Server Mongrel

html

Mongrel

1. http://readers.livingsocial.com 2. Page Template (if not cached) 3. Retrieve Fragments (if not cached)

39

1. http://readers.livingsocial.com

40

1. http://readers.livingsocial.com 2. Page Template (if not cached)
41

4 /header

(ttl = 60.min)

2
/recent (ttl = 10.min)

1
/mini_feed (ttl = 30.min)

3
/news (ttl = 60.min)
42

1. http://readers.livingsocial.com 2. Page Template (if not cached)

4

2

1
1. http://readers.livingsocial.com 2. Page Template (if not cached) 3. Retrieve Fragments (if not cached)

3
43

“Assembles”
1. 2. 3. 4. http://readers.livingsocial.com Page Template (if not cached) Retrieve Fragments (if not cached) Respond back to User
44

1. http://readers.livingsocial.com 2. Pagehttp://readers.livingsocial.com Template (cached)
45

4

2
“Assembles”
1. 2. 3. 4. http://readers.livingsocial.com Page Template (cached) Retrieve Fragments (cached) Respond back to User

1

3
46

4

2
“Assembles”
1. 2. 3. 4.

1

3
47

http://readers.livingsocial.com (cached) Page Template (cached) Retrieve Fragments (3 is cached) Respond back to User

So what! Memcache can do that!

48

ESI
ESI: Personalized Full Page Caching ESI: Concurrency ESI: Slow/Broken Dependencies ESI: Application Sharding ESI: Polyglot Assembly ESI: Inline Invalidation ESI: Cached New User Experience

49

ESI: Personalized Full Page Caching
caches_page cache(“whole_page”) {...} headers[“Cache-Control”] = “max-age:3600”

50

ESI: Concurrency

def show @feed = @person.mini_feed @current = @person.currently_reading @news = Blog.recent_by_vertical(“readingsocial”) end

51

ESI: Concurrency

def show @feed = @person.mini_feed # 1s @current = @person.currently_reading # 1s @news = Blog.recent_by_vertical(“readingsocial”) # 1s end

3s

52

ESI: Concurrency
def mini_feed #1s ... def currently_reading #1s ... def news #1s ...

3s -> 1s

53

ESI: Slow/Broken Dependencies

def show @feed = @person.mini_feed @current = @person.currently_reading @news = Blog.recent_by_vertical(“reading”) end

#10s

54

ESI: Slow/Broken Dependencies

<esi:include src=”/mini_feed” max-age=”600”/>

55

ESI: Slow/Broken Dependencies
<esi:try> <esi:attempt> <esi:include src=”/mini_feed” max-age=”600” timeout=”1”/> </esi:attempt> <esi:except> <esi:include src=”/static/mini_feed.html”/> </esi:except> </esi:try>
56

ESI: Application Sharding

“Federate as much as you can” “A rails process should only be doing one controller”

57

ESI: Application Sharding

/mini_feed

58

ESI: Polyglot Assembly

/mini_feed

Merb/Erlang

59

ESI: Cached New User Experience
4

2
/recent (ttl = 10.min)

1
/mini_feed (ttl = 30.min)

3
/news (ttl = 60.min)

60

ESI: Cached New User Experience
4

2
/recent (ttl = 10.min)

1
/mini_feed (ttl = 30.min)

3
/news (ttl = 60.min)

”/mini_feed?uid=$HTTP_COOKIE[“uid”]”
61

ESI:Cached New User Experience
4

2
/recent (ttl =

1
/mini_feed (ttl = 30.min)

3
/news (ttl = 60.min)

”/mini_feed?uid=”

Full Cache Hit!
62

ESI: Inline Invalidation

<esi:invalidate> .... <basicselector uri="/foo/bar/baz"/> ... <advancedselector uriexp="/people/123/.*"/> </esi:invalidate>

63

Agenda
- Examine a Rails Application - Apply Standard Caching Techniques - When thats not enough, then what? - Edge Caching - FragmentFu - Deployment Options - Pros/Cons of Edge Caching

64

FragmentFu
Project: http://code.google.com/p/mongrel-esi/ google: FragmentFu

“Proof of Concept”

65

FragmentFu

<%= render :esi => fragment_person_path, :ttl => 60.minutes %>

66

FragmentFu
def update .... invalidate_and_redirect_to(person_path(@person)) end

67

FragmentFu
def latest ... respond_to |wants| do wants.html { ... } wants.js { ... } #X-Requested-With = 'XMLHttpRequest' end end

68

FragmentFu
def latest ... respond_to |wants| do wants.html { ... } wants.js { ... } #X-Requested-With = 'XMLHttpRequest' wants.fragment { .... } #X-Requested-With = ʻESIRequest' end end

69

Agenda
- Examine a Rails Application - Apply Standard Caching Techniques - When thats not enough, then what? - Edge Caching - FragmentFu - Deployment Options - Pros/Cons of Edge Caching

70

- Open Source - Commerical - Content Delivery Network

71

mongrel-esi
http://code.google.com/p/mongrel-esi/

- Small, but fast - Open Source by Todd Fisher - Ragel based parser - memcache-backed caching

72

Squid
http://www.squid-cache.org/

- In 2002, Zope funded ESI - Version 3.0+ - subset of ESI support

73

Varnish
http://varnish.projects.linpro.no/

- Supposedly Fast
“Squid is rather old and designed like computer programs where supposed to be designed in 1980.” - Varnish FAQ

- basic ESI support - FunnyOrDie.com uses

74

Varnish
http://www.funnyordie.com/

- Supposedly Fast
“Squid is rather old and designed like computer programs where supposed to be designed in 1980.” http://varnish.projects.linpro.no/wiki/FAQ

- subset of ESI support - FunnyOrDie.com uses
56.6M views

75

Web Cache 10g
BIG-IP WebAccelerator

76

Web Cache 10g
2007 InfoQ Article - RevolutionHealth.com
http://www.infoq.com/news/2007/02/revolution-health-profile

“NetCraft says you've got Oracle Application Server 10g as the final public facing piece... “

77

Akamai

Most Complete ESI Implementation

78

Agenda
- Examine a Rails Application - Apply Standard Caching Techniques - When thats not enough, then what? - Edge Caching - FragmentFu - Deployment Options - Pros/Cons of Edge Caching

79

Edge Caching - Cons

YAGNI
80

Edge Caching - Cons

complexity

81

Edge Caching - Cons

cache invalidation
82

Edge Caching - Cons
“There are only two hard things in
Computer Science: cache invalidation and naming things” - Phil Karlton

83

Edge Caching - Cons
lack of mature open source

84

Edge Caching - Cons

cost of deployment
85

Edge Caching - Pros

concurrent execution

86

Edge Caching - Pros

efficient execution
87

Edge Caching - Pros
A/B Testing

88

Edge Caching - Pros
def mini_feed ... def currently_reading ... def news ...

RESTful application assembly
89

Edge Caching - Pros

Syndication
for

Free
90

Edge Caching - Pros
Geographically Distributed Personalization

91

92

http://blog.hungrymachine.com
flickr.com/photos/nickdawson/1484934955
flickr.com/photos/kamonegi_jp/1860174314

flickr.com/photos/petestott/1281698980 flickr.com/photos/bunchofpants/103515576/ flickr.com/photos/seikatsu/686399884/ flickr.com/photos/hand-nor-glove/2311353113 flickr.com/photos/scobleizer/2341031948/

flickr.com/photos/mdd/175287890 flickr.com/photos/caseywilliamson/82417809 flickr.com/photos/zeemanshuis/1351045987

93

Q&A
94

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->