Assembling Pages Last: Edge Caching, ESI and Rails

Preview:

Citation preview

Aaron Batalion5/31/2008

Assembling Pages LastEdge Caching, ESI, and Rails

1

2

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

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}”) { ...} 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