Aaron Batalion 5/31/2008 Assembling Pages Last Edge Caching, ESI, and Rails 1
Nov 12, 2014
Aaron Batalion5/31/2008
Assembling Pages LastEdge Caching, ESI, and Rails
1
2
www.livingsocial.com blog.livingsocial.com
About Me
3
http://rails100.pbwiki.com/
#2
About Me
www.revolution.com
4
- Examine a Rails Application
- Apply Standard Caching Techniques
- When thats not enough, then what?
- Edge Caching
- FragmentFu
- Deployment Options
- Pros/Cons of Edge Caching
Agenda
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
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}”) { ...} endend
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 OKDate: Fri, 15 Dec 2007 17:32:47 GMTContent-Length: 33286Cache-Control: max-age=7200Content-Type: text/html
31
HTTP/1.1 200 OKDate: Fri, 15 Dec 2007 17:32:47 GMTContent-Length: 33286Cache-Control: max-age=7200Content-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
ESIEdge Side Includes
2001 W3C Spechttp://www.w3.org/TR/esi-lang
By: Akamai, Oracle, BEA, Vignette...
34
simple markup languageesi:include esi:try esi:attempt esi:except esi:invalidate HTTP_* esi:chose esi:when
35
parsed by ESI server
36
Mongrel
Mongrel
Mongrel
ESI Server
1. http://readers.livingsocial.com2. Page Template
http://readers.livingsocial.com
html + esi
37
“Assembles”
4 /header (ttl = 60.min)
1/mini_feed (ttl = 30.min)
2/recent (ttl = 10.min)
3/news (ttl = 60.min)
<html> .......
<esi:include src="/mini_feed” max-age="1800"/> .......
</html>
38
Mongrel
Mongrel
Mongrel
ESI Server
1. http://readers.livingsocial.com2. Page Template (if not cached)3. Retrieve Fragments (if not cached)
http://readers.livingsocial.com html + esi
html
39
1. http://readers.livingsocial.com
40
1. http://readers.livingsocial.com2. Page Template (if not cached)
41
4 /header (ttl = 60.min)
1/mini_feed (ttl = 30.min)
2/recent (ttl = 10.min)
3/news (ttl = 60.min)
1. http://readers.livingsocial.com2. Page Template (if not cached)
42
4
12
31. http://readers.livingsocial.com2. Page Template (if not cached)3. Retrieve Fragments (if not cached)
43
“Assembles”
1. http://readers.livingsocial.com2. Page Template (if not cached)3. Retrieve Fragments (if not cached)4. Respond back to User
44
http://readers.livingsocial.com1. http://readers.livingsocial.com2. Page Template (cached)
45
“Assembles”
4
12
31. http://readers.livingsocial.com2. Page Template (cached)3. Retrieve Fragments (cached)4. Respond back to User
46
“Assembles”
4
12
31. 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
ESIESI: Personalized Full Page Caching ESI: ConcurrencyESI: Slow/Broken Dependencies ESI: Application ShardingESI: 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”) #10send
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
1/mini_feed (ttl = 30.min)
2/recent (ttl =
10.min)
3/news (ttl =
60.min)
4
60
ESI: Cached New User Experience
1/mini_feed (ttl = 30.min)
2/recent (ttl =
10.min)
3/news (ttl =
60.min)
4
”/mini_feed?uid=$HTTP_COOKIE[“uid”]”
61
ESI:Cached New User Experience
1/mini_feed (ttl = 30.min)
2/recent (ttl =
3/news (ttl =
60.min)
4
”/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
<%= render :esi => fragment_person_path, :ttl => 60.minutes %>
FragmentFu
66
def update .... invalidate_and_redirect_to(person_path(@person))end
FragmentFu
67
def latest ... respond_to |wants| do wants.html { ... } wants.js { ... } #X-Requested-With = 'XMLHttpRequest' endend
FragmentFu
68
def latest ... respond_to |wants| do wants.html { ... } wants.js { ... } #X-Requested-With = 'XMLHttpRequest' wants.fragment { .... } #X-Requested-With = ʻESIRequest' endend
FragmentFu
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 uses56.6M views
75
Web Cache 10g
B 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
YAGNI
Edge Caching - Cons
80
complexity
Edge Caching - Cons
81
cache
invalidation
Edge Caching - Cons
82
“There are only two hard things in
Computer Science: cache invalidation
and naming things”
- Phil Karlton
Edge Caching - Cons
83
lack of mature
open source
Edge Caching - Cons
84
cost of
deployment
Edge Caching - Cons
85
concurrent execution
Edge Caching - Pros
86
efficient execution
Edge Caching - Pros
87
A/B
Testing
Edge Caching - Pros
88
RESTfulapplication
assembly
Edge Caching - Pros
def mini_feed ...def currently_reading ...def news ...
89
Syndication for
Free
Edge Caching - Pros
90
Geographically
Distributed
Personalization
Edge Caching - Pros
91
92
flickr.com/photos/nickdawson/1484934955
flickr.com/photos/kamonegi_jp/1860174314
flickr.com/photos/mdd/175287890
flickr.com/photos/caseywilliamson/82417809
flickr.com/photos/zeemanshuis/1351045987
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/
http://blog.hungrymachine.com
93
Q&A
94