• Save
Assembling Ruby on Rails Pages Last With ESI
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Assembling Ruby on Rails Pages Last With ESI

on

  • 4,582 views

 

Statistics

Views

Total Views
4,582
Views on SlideShare
4,574
Embed Views
8

Actions

Likes
2
Downloads
0
Comments
0

1 Embed 8

http://www.slideshare.net 8

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Assembling Ruby on Rails Pages Last With ESI Presentation Transcript

  • 1. Assembling Pages Last Edge Caching, ESI, and Rails Aaron Batalion 5/31/2008 1
  • 2. 2
  • 3. About Me www.livingsocial.com blog.livingsocial.com 3
  • 4. About Me www.revolution.com #2 http://rails100.pbwiki.com/ 4
  • 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 5
  • 6. 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. 7
  • 8. 8
  • 9. 9
  • 10. 10
  • 11. 11
  • 12. 12
  • 13. 13
  • 14. http://readers.livingsocial.com 14
  • 15. def show @feed = @person.mini_feed @current = @person.currently_reading @news = Blog.recent_by_vertical(“readingsocial”) end 15
  • 16. <html> <%= render :partial => "header/login" -%> <%= render :partial => "feed" -%> <%= render :partial => "current" -%> <%= render :partial => "news" -%> </html> 16
  • 17. When thats not enough, then what? 17
  • 18. When thats not enough, then what? 18
  • 19. When thats not enough, then what? 19
  • 20. 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
  • 21. class PeopleController caches_page :show ... end 21
  • 22. class PeopleController caches_page :show ... end 22
  • 23. class PeopleController caches_action :show ... end 23
  • 24. class PeopleController caches_action :show ... end 24
  • 25. <% cache(“mini-feed-#{@person.id}”) do %> <% @feed = @person.mini_feed %> <%= render :partial => "feed" -%> <% end %> 25
  • 26. class Person def mini_feed cache(“feed-#{id}”) { ...} end end 26
  • 27. When thats not enough, then what? When thats not enough.... 27
  • 28. 28
  • 29. Rails isn’t fast.... It is fast enough You can always get LOTS and LOTS of servers... 29
  • 30. Use your application Without hitting your application 30
  • 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 31
  • 32. 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
  • 33. 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
  • 34. ESI Edge Side Includes 2001 W3C Spec http://www.w3.org/TR/esi-lang By: Akamai, Oracle, BEA, Vignette... 34
  • 35. simple markup language esi:include esi:try esi:attempt esi:except esi:invalidate HTTP_* esi:chose esi:when 35
  • 36. parsed by ESI server 36
  • 37. Mongrel http://readers.livingsocial.com ESI html + esi Server Mongrel Mongrel 1. http://readers.livingsocial.com 2. Page Template 37
  • 38. 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
  • 39. 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
  • 40. 1. http://readers.livingsocial.com 40
  • 41. 1. http://readers.livingsocial.com 2. Page Template (if not cached) 41
  • 42. 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
  • 43. 4 2 1 3 1. http://readers.livingsocial.com 2. Page Template (if not cached) 3. Retrieve Fragments (if not cached) 43
  • 44. “Assembles” 1. http://readers.livingsocial.com 2. Page Template (if not cached) 3. Retrieve Fragments (if not cached) 4. Respond back to User 44
  • 45. 1. http://readers.livingsocial.com 2. Pagehttp://readers.livingsocial.com Template (cached) 45
  • 46. 4 2 1 “Assembles” 3 1. http://readers.livingsocial.com 2. Page Template (cached) 3. Retrieve Fragments (cached) 4. Respond back to User 46
  • 47. 4 2 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
  • 48. So what! Memcache can do that! 48
  • 49. 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
  • 50. ESI: Personalized Full Page Caching caches_page cache(“whole_page”) {...} headers[“Cache-Control”] = “max-age:3600” 50
  • 51. ESI: Concurrency def show @feed = @person.mini_feed @current = @person.currently_reading @news = Blog.recent_by_vertical(“readingsocial”) end 51
  • 52. ESI: Concurrency def show @feed = @person.mini_feed # 1s @current = @person.currently_reading # 1s @news = Blog.recent_by_vertical(“readingsocial”) # 1s end 3s 52
  • 53. ESI: Concurrency def mini_feed #1s ... def currently_reading #1s ... def news #1s 3s -> 1s ... 53
  • 54. ESI: Slow/Broken Dependencies def show @feed = @person.mini_feed @current = @person.currently_reading @news = Blog.recent_by_vertical(“reading”) #10s end 54
  • 55. ESI: Slow/Broken Dependencies <esi:include src=”/mini_feed” max-age=”600”/> 55
  • 56. 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
  • 57. ESI: Application Sharding “Federate as much as you can” “A rails process should only be doing one controller” 57
  • 58. ESI: Application Sharding /mini_feed 58
  • 59. ESI: Polyglot Assembly /mini_feed Merb/Erlang 59
  • 60. ESI: Cached New User Experience 4 2 /recent (ttl = 10.min) 1 /mini_feed (ttl = 30.min) 3 /news (ttl = 60.min) 60
  • 61. 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
  • 62. 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
  • 63. ESI: Inline Invalidation <esi:invalidate> .... <basicselector uri="/foo/bar/baz"/> ... <advancedselector uriexp="/people/123/.*"/> </esi:invalidate> 63
  • 64. 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
  • 65. FragmentFu Project: http://code.google.com/p/mongrel-esi/ google: FragmentFu “Proof of Concept” 65
  • 66. FragmentFu <%= render :esi => fragment_person_path, :ttl => 60.minutes %> 66
  • 67. FragmentFu def update .... invalidate_and_redirect_to(person_path(@person)) end 67
  • 68. FragmentFu def latest ... respond_to |wants| do wants.html { ... } wants.js { ... } #X-Requested-With = 'XMLHttpRequest' end end 68
  • 69. FragmentFu def latest ... respond_to |wants| do wants.html { ... } wants.js { ... } #X-Requested-With = 'XMLHttpRequest' wants.fragment { .... } #X-Requested-With = ʻESIRequest' end end 69
  • 70. 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
  • 71. - Open Source - Commerical - Content Delivery Network 71
  • 72. mongrel-esi http://code.google.com/p/mongrel-esi/ - Small, but fast - Open Source by Todd Fisher - Ragel based parser - memcache-backed caching 72
  • 73. Squid http://www.squid-cache.org/ - In 2002, Zope funded ESI - Version 3.0+ - subset of ESI support 73
  • 74. 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
  • 75. 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
  • 76. Web Cache 10g BIG-IP WebAccelerator 76
  • 77. 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
  • 78. Akamai Most Complete ESI Implementation 78
  • 79. 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
  • 80. Edge Caching - Cons YAGNI 80
  • 81. Edge Caching - Cons complexity 81
  • 82. Edge Caching - Cons cache invalidation 82
  • 83. Edge Caching - Cons “There are only two hard things in Computer Science: cache invalidation and naming things” - Phil Karlton 83
  • 84. Edge Caching - Cons lack of mature open source 84
  • 85. Edge Caching - Cons cost of deployment 85
  • 86. Edge Caching - Pros concurrent execution 86
  • 87. Edge Caching - Pros efficient execution 87
  • 88. Edge Caching - Pros A/B Testing 88
  • 89. Edge Caching - Pros def mini_feed ... def currently_reading ... RESTful def news ... application assembly 89
  • 90. Edge Caching - Pros Syndication for Free 90
  • 91. Edge Caching - Pros Geographically Distributed Personalization 91
  • 92. 92
  • 93. 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
  • 94. Q&A 94