Professional Documents
Culture Documents
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
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
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
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
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
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
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)
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
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/
72
Squid
http://www.squid-cache.org/
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
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
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
77
Akamai
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
- 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