You are on page 1of 94

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 :partial => "header/login" -%>
<%= render :partial => "feed" -%>
<%= render :partial => "current" -%>
<%= render :partial => "news" -%>
</html>

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:try
esi:attempt esi:except
esi:invalidate HTTP_*
esi:chose esi:when

35
parsed by ESI server

36
Mongrel

http://readers.livingsocial.com

ESI html + esi


Server Mongrel

Mongrel

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

37
4 /header (ttl = 60.min)

2
/recent (ttl = 10.min)

“Assembles”
1
/mini_feed (ttl = 30.min)
3
/news (ttl = 60.min)
<html>
.......
<esi:include src="/mini_feed” max-age="1800"/>
.......
</html>

38
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)

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

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

43
“Assembles”

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

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

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

46
4

1
“Assembles”
3
1. http://readers.livingsocial.com (cached)
2. Page Template (cached)
3. Retrieve Fragments (3 is cached)
4. Respond back to User
47
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”) #10s
end

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
...
RESTful
def news
... 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/petestott/1281698980

flickr.com/photos/kamonegi_jp/1860174314 flickr.com/photos/bunchofpants/103515576/

flickr.com/photos/mdd/175287890 flickr.com/photos/seikatsu/686399884/

flickr.com/photos/caseywilliamson/82417809 flickr.com/photos/hand-nor-glove/2311353113

flickr.com/photos/zeemanshuis/1351045987 flickr.com/photos/scobleizer/2341031948/

93
Q&A

94

You might also like