94
Aaron Batalion 5/31/2008 Assembling Pages Last Edge Caching, ESI, and Rails 1

Assembling Pages Last: Edge Caching, ESI and Rails

Embed Size (px)

Citation preview

Page 1: Assembling Pages Last: Edge Caching, ESI and Rails

Aaron Batalion5/31/2008

Assembling Pages LastEdge Caching, ESI, and Rails

1

Page 2: Assembling Pages Last: Edge Caching, ESI and Rails

2

Page 4: Assembling Pages Last: Edge Caching, ESI and Rails

http://rails100.pbwiki.com/

#2

About Me

www.revolution.com

4

Page 5: Assembling Pages Last: Edge Caching, ESI and Rails

- 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

Page 6: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 7: Assembling Pages Last: Edge Caching, ESI and Rails

7

Page 8: Assembling Pages Last: Edge Caching, ESI and Rails

8

Page 9: Assembling Pages Last: Edge Caching, ESI and Rails

9

Page 10: Assembling Pages Last: Edge Caching, ESI and Rails

10

Page 11: Assembling Pages Last: Edge Caching, ESI and Rails

11

Page 12: Assembling Pages Last: Edge Caching, ESI and Rails

12

Page 13: Assembling Pages Last: Edge Caching, ESI and Rails

13

Page 14: Assembling Pages Last: Edge Caching, ESI and Rails

http://readers.livingsocial.com

14

Page 15: Assembling Pages Last: Edge Caching, ESI and Rails

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

15

Page 16: Assembling Pages Last: Edge Caching, ESI and Rails

<html> <%= render :partial => "header/login" -%> <%= render :partial => "feed" -%> <%= render :partial => "current" -%> <%= render :partial => "news" -%></html>

16

Page 17: Assembling Pages Last: Edge Caching, ESI and Rails

When thats not enough, then what?

17

Page 18: Assembling Pages Last: Edge Caching, ESI and Rails

When thats not enough, then what?

18

Page 19: Assembling Pages Last: Edge Caching, ESI and Rails

When thats not enough, then what?

19

Page 20: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 21: Assembling Pages Last: Edge Caching, ESI and Rails

class PeopleController caches_page :show ...end

21

Page 22: Assembling Pages Last: Edge Caching, ESI and Rails

class PeopleController caches_page :show ...end

22

Page 23: Assembling Pages Last: Edge Caching, ESI and Rails

class PeopleController caches_action :show ...end

23

Page 24: Assembling Pages Last: Edge Caching, ESI and Rails

class PeopleController caches_action :show ...end

24

Page 25: Assembling Pages Last: Edge Caching, ESI and Rails

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

25

Page 26: Assembling Pages Last: Edge Caching, ESI and Rails

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

26

Page 27: Assembling Pages Last: Edge Caching, ESI and Rails

When thats not enough, then what?

When thats not enough....

27

Page 28: Assembling Pages Last: Edge Caching, ESI and Rails

28

Page 29: Assembling Pages Last: Edge Caching, ESI and Rails

Rails isn’t fast....

It is fast enough

You can always get

LOTS and LOTS of servers...

29

Page 30: Assembling Pages Last: Edge Caching, ESI and Rails

Use your application

Without hitting your application

30

Page 31: Assembling Pages Last: Edge Caching, ESI and Rails

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

31

Page 32: Assembling Pages Last: Edge Caching, ESI and Rails

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

32

Page 33: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 34: Assembling Pages Last: Edge Caching, ESI and Rails

ESIEdge Side Includes

2001 W3C Spechttp://www.w3.org/TR/esi-lang

By: Akamai, Oracle, BEA, Vignette...

34

Page 35: Assembling Pages Last: Edge Caching, ESI and Rails

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

35

Page 36: Assembling Pages Last: Edge Caching, ESI and Rails

parsed by ESI server

36

Page 37: Assembling Pages Last: Edge Caching, ESI and Rails

Mongrel

Mongrel

Mongrel

ESI Server

1. http://readers.livingsocial.com2. Page Template

http://readers.livingsocial.com

html + esi

37

Page 38: Assembling Pages Last: Edge Caching, ESI and Rails

“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

Page 39: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 40: Assembling Pages Last: Edge Caching, ESI and Rails

1. http://readers.livingsocial.com

40

Page 41: Assembling Pages Last: Edge Caching, ESI and Rails

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

41

Page 42: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 43: Assembling Pages Last: Edge Caching, ESI and Rails

4

12

31. http://readers.livingsocial.com2. Page Template (if not cached)3. Retrieve Fragments (if not cached)

43

Page 44: Assembling Pages Last: Edge Caching, ESI and Rails

“Assembles”

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

44

Page 45: Assembling Pages Last: Edge Caching, ESI and Rails

http://readers.livingsocial.com1. http://readers.livingsocial.com2. Page Template (cached)

45

Page 46: Assembling Pages Last: Edge Caching, ESI and Rails

“Assembles”

4

12

31. http://readers.livingsocial.com2. Page Template (cached)3. Retrieve Fragments (cached)4. Respond back to User

46

Page 47: Assembling Pages Last: Edge Caching, ESI and Rails

“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

Page 48: Assembling Pages Last: Edge Caching, ESI and Rails

So what!

Memcache can do that!

48

Page 49: Assembling Pages Last: Edge Caching, ESI and Rails

ESIESI: Personalized Full Page Caching ESI: ConcurrencyESI: Slow/Broken Dependencies ESI: Application ShardingESI: Polyglot Assembly ESI: Inline Invalidation ESI: Cached New User Experience

49

Page 50: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Personalized Full Page Caching caches_page

cache(“whole_page”) {...}

headers[“Cache-Control”] = “max-age:3600”

50

Page 51: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Concurrency

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

51

Page 52: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Concurrency

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

3s

52

Page 53: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Concurrency

def mini_feed #1s ...def currently_reading #1s ...

def news #1s 3s -> 1s ...

53

Page 54: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Slow/Broken Dependencies

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

54

Page 55: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Slow/Broken Dependencies

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

55

Page 56: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 57: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Application Sharding

“Federate as much as you can”

“A rails process should only

be doing one controller”

57

Page 58: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Application Sharding

/mini_feed

58

Page 59: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Polyglot Assembly

/mini_feed

Merb/Erlang

59

Page 60: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Cached New User Experience

1/mini_feed (ttl = 30.min)

2/recent (ttl =

10.min)

3/news (ttl =

60.min)

4

60

Page 61: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 62: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 63: Assembling Pages Last: Edge Caching, ESI and Rails

ESI: Inline Invalidation

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

63

Page 64: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 65: Assembling Pages Last: Edge Caching, ESI and Rails

FragmentFu

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

“Proof of Concept”

65

Page 66: Assembling Pages Last: Edge Caching, ESI and Rails

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

FragmentFu

66

Page 67: Assembling Pages Last: Edge Caching, ESI and Rails

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

FragmentFu

67

Page 68: Assembling Pages Last: Edge Caching, ESI and Rails

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

FragmentFu

68

Page 69: Assembling Pages Last: Edge Caching, ESI and Rails

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

FragmentFu

69

Page 70: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 71: Assembling Pages Last: Edge Caching, ESI and Rails

- Open Source

- Commerical

- Content Delivery Network

71

Page 72: Assembling Pages Last: Edge Caching, ESI and Rails

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

- Small, but fast

- Open Source by Todd Fisher

- Ragel based parser

- memcache-backed caching

72

Page 73: Assembling Pages Last: Edge Caching, ESI and Rails

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

- In 2002, Zope funded ESI

- Version 3.0+

- subset of ESI support

73

Page 74: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 75: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 76: Assembling Pages Last: Edge Caching, ESI and Rails

Web Cache 10g

B BIG-IP WebAccelerator

76

Page 77: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 78: Assembling Pages Last: Edge Caching, ESI and Rails

Akamai

Most Complete ESI Implementation

78

Page 79: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 80: Assembling Pages Last: Edge Caching, ESI and Rails

YAGNI

Edge Caching - Cons

80

Page 81: Assembling Pages Last: Edge Caching, ESI and Rails

complexity

Edge Caching - Cons

81

Page 82: Assembling Pages Last: Edge Caching, ESI and Rails

cache

invalidation

Edge Caching - Cons

82

Page 83: Assembling Pages Last: Edge Caching, ESI and Rails

“There are only two hard things in

Computer Science: cache invalidation

and naming things”

- Phil Karlton

Edge Caching - Cons

83

Page 84: Assembling Pages Last: Edge Caching, ESI and Rails

lack of mature

open source

Edge Caching - Cons

84

Page 85: Assembling Pages Last: Edge Caching, ESI and Rails

cost of

deployment

Edge Caching - Cons

85

Page 86: Assembling Pages Last: Edge Caching, ESI and Rails

concurrent execution

Edge Caching - Pros

86

Page 87: Assembling Pages Last: Edge Caching, ESI and Rails

efficient execution

Edge Caching - Pros

87

Page 88: Assembling Pages Last: Edge Caching, ESI and Rails

A/B

Testing

Edge Caching - Pros

88

Page 89: Assembling Pages Last: Edge Caching, ESI and Rails

RESTfulapplication

assembly

Edge Caching - Pros

def mini_feed ...def currently_reading ...def news ...

89

Page 90: Assembling Pages Last: Edge Caching, ESI and Rails

Syndication for

Free

Edge Caching - Pros

90

Page 91: Assembling Pages Last: Edge Caching, ESI and Rails

Geographically

Distributed

Personalization

Edge Caching - Pros

91

Page 92: Assembling Pages Last: Edge Caching, ESI and Rails

92

Page 93: Assembling Pages Last: Edge Caching, ESI and Rails

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

Page 94: Assembling Pages Last: Edge Caching, ESI and Rails

Q&A

94