0% found this document useful (0 votes)
42 views58 pages

2009 10 06 Caching JAOO

The document discusses caching strategies for web services and REST APIs. It covers common caching models like expiration-based caching, validation-based caching, and combination caching. It also discusses caching implementations using technologies like Apache FileETag, Edge Side Includes (ESI), and common cache topologies involving proxies, reverse proxies, and complex caching networks. Cache intermediaries like Squid and Apache's mod_cache module are also summarized.

Uploaded by

rikoton
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
42 views58 pages

2009 10 06 Caching JAOO

The document discusses caching strategies for web services and REST APIs. It covers common caching models like expiration-based caching, validation-based caching, and combination caching. It also discusses caching implementations using technologies like Apache FileETag, Edge Side Includes (ESI), and common cache topologies involving proxies, reverse proxies, and complex caching networks. Cache intermediaries like Squid and Apache's mod_cache module are also summarized.

Uploaded by

rikoton
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 58

REST & Caching: Web Services, Accelerated

JAOO 2009 Stefan Tilkov, innoQ

Tuesday, October 6, 2009

Reliable Asynchronous Messaging Profile (RAMP)


1.0 WS-I Working Draft

Version 3.0* February 2007

innoQ Deutschland GmbH innoQ Schweiz GmbH Halskestrae 17 Gewerbestrasse 11 D-40880 Ratingen CH-6330 Cham Phone +49 21 02 77 162-100 Phone +41 41 743 0111 [email protected] www.innoq.com

[email protected] http://www.innoq.com/blog/st/ @stilkov

http://rest-http.info

http://soa-expertenwissen.de

Tuesday, October 6, 2009

The REST Uniform Interface

identication of resources

resource manipulation through representations

hypermedia as the engine of application state

self-descriptive messages

Tuesday, October 6, 2009

The REST Uniform Interface


identication of resources resource manipulation through representations hypermedia as the engine of application state self-descriptive messages

http://example.com/orders?year=2008 http://example.com/customers/1234 http://example.com/orders/2007/10/776654 http://example.com/products/4554 http://example.com/processes/sal-increase-234

Tuesday, October 6, 2009

The REST Uniform Interface


identication of resources resource manipulation through representations hypermedia as the engine of application state self-descriptive messages

GET /customers/1234 Host: example.com Accept: application/vnd.mycompany.customer+xml <customer>...</customer> GET /customers/1234 Host: example.com Accept: text/x-vcard
begin:vcard ... end:vcard
Tuesday, October 6, 2009

The REST Uniform Interface


identication of resources resource manipulation through representations hypermedia as the engine of application state self-descriptive messages

<order self='http://example.com/orders/3321'> <amount>23</amount> <product ref='http://example.com/products/4554' /> <customer ref='http://example.com/customers/1234' /> <link rel='edit ref='http://example.com/order-edit/ACDB' /> </order>

Tuesday, October 6, 2009

The REST Uniform Interface


identication of resources resource manipulation through representations hypermedia as the engine of application state self-descriptive messages

Standard Method

GET /service/customers/1234 HTTP 1.1 Host: www.example.com User-Agent: ! XYZ 1.1 Accept: ! text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Keep-Alive:! 300 Connection:! keep-alive If-Modied-Since: ! Fri, 02 Oct 2009 16:47:31 GMT If-None-Match: ! "600028c-59fb-474f6852c9dab" Cache-Control: !max-age=60 HTTP/1.1 304 Not Modied Date: ! Sun, 04 Oct 2009 19:36:25 GMT Server:! Apache/2.2.11 (Debian) Last-Modied:! Fri, 02 Oct 2009 16:47:31 GMT Etag: ! "600028c-59fb-474f6852c9dab" Cache-Control: max-age=300 Accept-Ranges: ! bytes Vary:! Accept-Encoding Content-Encoding: ! gzip Content-Length:! 7160 Keep-Alive:! timeout=15, max=91 Connection:! Keep-Alive Content-Type: ! application/xml <?xml version=1.0 encoding=utf-8 ?> ...

Media Type

Control Data

Data

Tuesday, October 6, 2009

getOrderDetails() submitApplicationData() updateQuote() ndMatchingBid() initiateProcess() cancelSubscription() listAuctions() getUsers()


Tuesday, October 6, 2009

getOrderDetails() ndMatchingBid()

initiateProcess() submitApplicationData()

GET listAuctions()
getUsers()

POST

PUT
updateQuote()
Tuesday, October 6, 2009

DELETE
cancelSubscription()

interface Resource { !!!! Resource(URI u) !!!! Response get() !!!! Response post(Request r) !!!! Response put(Request r) !!!! Response delete() }

generic
Any HTTP client (Firefox, IE, curl, wget) Any HTTP server Caches Proxies Google,Yahoo!, MSN

class CustomerCollection : Resource { !!!! ... !!!! Response post(Request r) { !!!! !!!! id = createCustomer(r) !!!! !!!! return new Response(201, r) } !!!! ... }

Anything that knows your app

specic
Tuesday, October 6, 2009

Caching Models

Note: Thanks to Ryan Tomayko for letting me steal base some work on his diagrams from http://tomayko.com/writings/things-caches-do
Tuesday, October 6, 2009

!"#$%&

!'()$

*'(+$%,

-./012$"(34$ -./012$"(34$ (3,$0&305$%,06'(+ 78$""3093:",70)$:$ ;<<0=> 8$""3093:", ;<<0=> 8$""3093:", !"#$%& !'()$ *'(+$%,

Tuesday, October 6, 2009

Expiration

Tuesday, October 6, 2009

!"#$%& -./012$"(34$

!'()$

*'(+$%,

-./012$"(34$ 56$""30738",5 9('(:"'&#%;04'<0&3"$8'="$0';$> ?@@0AB !'()$C!3%&83"D04'<C';$EF@@ 6$""30738",G ?@@0AB !'()$C!3%&83"D04'<C';$EF@@ 6$""30738",G !"#$%& !'()$ *'(+$%,

Tuesday, October 6, 2009

!"# ,-./01(2&"3(

$%&'(

!%&)(*+

.'45/+"(5/*"6/'%77(*/888 888/#(&%95(/6'(/&%&'(/45/:;(5'<

=>>/?@ AB(C/D> $%&'(E$"*6;"2C/3%FE%B(GH>> I(22"/J";2+< !"# $%&'( !%&)(*+

Tuesday, October 6, 2009

Validation

Tuesday, October 6, 2009

!"#$% -./012%"$34%

&'$(%

)'$*%+,

-./012%"$34% 5%+%6'7%08'"#,'7369: ;<%""30=36",; >??0@A B'97CD3,#E#%,F0/G%H0>I0@$7JJJ ./'5F0'K%LMM'E, <%""30=36", >??0@A B'97CD3,#E#%,F0/G%H0>I0@$7JJJ ./'5F0'K%LMM'E, <%""30=36", !"#$% &'$(% )'$*%+,

Tuesday, October 6, 2009

!"# ,-./01(2&"3(

$%&'(

!%&)(*+

,-./01(2&"3( 4567"+858(+698*&(:/.;(</=>/?&@AAA 456B"*(67%@&':/%C(DEE%5+ F(*(G%@(/H%28+%@"GIJ K?/B?./F(*(G%@(/G(IL"*I( CMD/B"@/7"+858(+ =MM/?N O%I@67"+858(+:/.;(</=>/?&@AAA -.%F:/%C(DEE%5+ P(22"/Q"G2+ !"# $%&'( !%&)(*+

Tuesday, October 6, 2009

Combination

Tuesday, October 6, 2009

!"#$% -./012%"$34%

&'$(%

)'$*%+,

-./012%"$34% 5%+%6'7%08'"#,'7369: ;<%""30=36",; >??0@A &'$(%B&3+763"C04'DB'5%EF? G'97BH3,#I#%,C0/J%K0>L0@$7MMM <%""30=36", >??0@A &'$(%B&3+763"C04'DB'5%EF? G'97BH3,#I#%,C0/J%K0>L0@$7MMM <%""30=36", !"#$% &'$(% )'$*%+,

Tuesday, October 6, 2009

!"# ,-./01(2&"3(

$%&'(

!%&)(*+

.'45/+"(5/*"6/'%77(*/888 888/#(&%95(/6'(/&%&'(/45/:;(5'<

=>>/?@ $%&'(A$"*6;"2B/3%CA%D(EF> GD(B/H> I%56AJ"+4:4(+B/.9(K/=L/?&6888 M(22"/N";2+ !"# $%&'( !%&)(*+

Tuesday, October 6, 2009

!"#$% -./012(%&$3(

!"&'(

)"&*(+,

-./012(%&$3( 4567$,858(,698+&(:0/;(<0=>0?&@AAA B(+(#"@(0C"%8,"@$#DE F?0G?/0B(+(#"@(0#(DH$+D( IJK0G$@07$,858(, !"&'(6!$+@#$%:03"L6"B(MNJ =JJ0?O !"&'(6!$+@#$%:03"L6"B(MNJ P"D@67$,858(,:0/;(<0=>0?&@AAA Q(%%$0R$#%, !"#$% !"&'( )"&*(+,

Tuesday, October 6, 2009

Implementation

Tuesday, October 6, 2009

!"#$%&

!'()$

*$+,-$./$.

0#"$,-12&$3

4'(5,6%7

*.#&$,0#"$ 869,:;$"(<3$ 869,:;$"(<3$ =$'7,0#"$ =$&>.%,0#"$,!<%&$%&2 =$&>.%,=$2?<%2$ ,@,!'()#%A,)$'7$.2 =$&>.%,=$2?<%2$ !"#$%& !'()$ *$+,-$./$. 0#"$,-12&$3 4'(5,6%7

Tuesday, October 6, 2009

Apache FileETag
FileETag INode MTime Size

number of bytes in the le date and time the le was last modied le's i-node number

Tuesday, October 6, 2009

ETag Depth

Tuesday, October 6, 2009

!"#$%& *-.,45$"(06$

!'()$

*$%$+#(,-.'/,*$%$+'&0+

1'(2,-%3

*-.,45$"(06$ *-.,45$"(06$ 7$&8+%,7$9:0%9$ !06:8&$,-.'/

7$&8+%,7$9:0%9$ ,;,-.'/ 7$&8+%,7$9:0%9$ !"#$%& !'()$ *$%$+#(,-.'/,*$%$+'&0+ 1'(2,-%3

Tuesday, October 6, 2009

!"#$%& 203-45$"(6+$

!'()$

*+',&-.'(/-0%1

203-45$"(6+$ 7$&8,%-7$9:6%9$ -;-03'< 7$&8,%-7$9:6%9$ !"#$%& !'()$ *+',&-.'(/-0%1

Tuesday, October 6, 2009

!"#$%& 203-45$"(6+$

!'()$

*+',&-.'(/-0%1

203-45$"(6+$ 7$&8,%-7$9:6%9$ -;-03'<=->'?$@AA'B1> 203-45$"(6+$ 203-45$"(6+$ CBDE6%$DF'&()=-'?$@AA'B1 !)$(/-'%1-(6+:8&$-03'<

?G@-E6&-F61#B#$1 7$&8,%-7$9:6%9$ !"#$%&


Tuesday, October 6, 2009

!'()$

*+',&-.'(/-0%1

Edge Side Includes (ESI)

Tuesday, October 6, 2009

<esi:include src="http://example.com/1.html" alt="http://bak.example.com/2.html" onerror="continue"/> <esi:include src="http://example.com/search?query=$(QUERY_STRING{query})"/>

Tuesday, October 6, 2009

!"#$%

&$' 0-1,23&

!"()*

&"(+,-./

0-1,23& 4*56#.,4*78$.7* 4*56#.,4*78$.7* 0-1,23! 0-1,23! 4*56#.,4*78$.7* 4*56#.,4*78$.7* !"#$% &$' !"()* &"(+,-./

Tuesday, October 6, 2009

!"# .+/*01!

$%&'(

!%&)*+,-

.+/*01 2(345,*2(67",6( +/%89*:%;(<==%>-: +?@*AB,&C4-(*0D .+/*0! 1885(8%3(*1*E*!

2(345,*2(67",6( !"# $%&'( !%&)*+,-

Tuesday, October 6, 2009

!"# .+/*01!

$%&'(

!%&)*+,-

.+/*01*-"(2*,"3*'%44(,*555 555*#(&%62(*3'(*&%&'(*72*89(2':

.+/*0$ 1;;9(;%3(*1*<*$

=(369,*=(24",2( !"# $%&'( !%&)*+,-

Tuesday, October 6, 2009

Cache Topologies

Tuesday, October 6, 2009

Client

Cache

Client

Client

Cache

Server

Client

Cache

Server

Client

Cache

Client

Client only
Client

Proxy Cache
Cache

Client

Client Cache Server Client

Cache

Cache

Server

Client

Client Client Cache

Reverse Proxy Cache


Tuesday, October 6, 2009

Complex Topology

Server Client

Client

Server

Cache

Server

Client

Server

"Cache as ESB"
Tuesday, October 6, 2009

Web Sites vs. Web Services

Tuesday, October 6, 2009

Application Layers
Presentation/UI Data Formatting Control Flow Aggregate Logic Business Rules Relations
(create, select, update, delete)

Browser View Controller Model Database Lib


Utility Functions

Data

Tuesday, October 6, 2009

App Layers & Resources


Presentation/UI Data Formatting Control Flow Aggregate Logic Business Rules Relations
(create, select, update, delete)

Browser View Controller Model Database

REST Client

Lib

Utility Functions

Data

Tuesday, October 6, 2009

Single Resource Model


Browser (Other) REST Client

Application
Resource Resource Resource

Everything doable via UI becomes doable via API UI Backend = API

Tuesday, October 6, 2009

Intermediaries

Tuesday, October 6, 2009

Squid
Full proxy cache w/ reverse proxy option Mature/stable/old, widely used Complicated conguration Support for ESI Support for external invalidation (PURGE) (Experimental) support for cache channels (much, much more)

Tuesday, October 6, 2009

mod_cache
mod_cache module for Apache HTTPD 2.x (production-ready in 2.2) backends: mod_mem_cache and mod_disk_cache Runs within Apache process Simple solution in conjunction with Passenger No support for ESI or explicit invalidation

Tuesday, October 6, 2009

<VirtualHost 1.2.3.4> ServerName example.com <Location /images> ExpiresActive On ExpiresDefault A3600 </Location> <Location /user> ExpiresActive On ExpiresDefault "access plus 1 month" </Location> CacheEnable disk /images CacheRoot /var/www/cache ProxyPass / http://localhost:3000 ProxyPassReverse / http://localhost:3000 </VirtualHost>

Tuesday, October 6, 2009

Varnish
Pure in-memory reverse proxy Disk storage through OS swap mechanism (Partial) ESI support External invalidation VCL conguration language Easy conguration

Tuesday, October 6, 2009

sub vcl_recv { if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") { /* Non-RFC2616 or CONNECT which is weird. */ return (pipe); } if (req.request != "GET" && req.request != "HEAD") { /* We only deal with GET and HEAD by default */ return (pass); } if (req.http.Authorization || req.http.Cookie) { /* Not cacheable by default */ return (pass); } return (lookup); }

VCL
Hook vcl_recv vcl_pipe vcl_pass vcl_hit vcl_miss vcl_fetch vcl_deliver vcl_timeout vcl_discard Meaning Called at the beginning of a request Called upon entering pipe mode Called upon entering pass mode Called after a cache lookup if the requested document was found in the cache Called after a cache lookup if the requested document was not found in the cache Called after a document has been successfully retrieved from the backend Called before a cached object is delivered to the client Called by the reaper thread shortly before a cached document reaches its expiry time Called by the reaper thread when a cached document is about to be discarded

Tuesday, October 6, 2009

Rack::Cache
Runs within Ruby process Cross-process synchronization via memcached Absurdly simple + transparent
config.middleware.use(Rack::Cache, :verbose => true, :metastore => 'file:/var/cache/rack/meta', :entitystore => 'file:/var/cache/rack/body')

Tuesday, October 6, 2009

Clients

Tuesday, October 6, 2009

Cache-aware HTTP Clients


Note: Conditional GET does not require anything special Your browser and news reader .NET (HttpWebRequest) Python httplib2 HttpCache4J

Tuesday, October 6, 2009

So what?

Tuesday, October 6, 2009

How to Exploit HTTP Caching


1. Provide safe resource access via GET 2. Include appropriate validation and cache control headers 3. Leave caching to a reverse proxy cache 4. Use conditional GET on the client 5. Prot :-)

Tuesday, October 6, 2009

I do think the REST-afarians are missing an opportunity by not driving home the secret sauce that is HTTP GET. [] GET is one of the most optimized pieces of distributed systems plumbing in the world."It's an absolute/objective slam dunk. No arguing/evangelism needed IMO. GET is the classic the rst bag is free kind of feature a platform builder dreams about.

Don Box, Co-inventor of SOAP

Tuesday, October 6, 2009

Stefan Tilkov
http://www.innoq.com/blog/st/

Thank you! Any questions?


http://www.innoq.com

Architectural Consulting SOA MDA J(2)EE WS-* MDSD RoR REST MDE .NET

Tuesday, October 6, 2009

Backup

Tuesday, October 6, 2009

Turning Session State


Client 1

R1

Server

R1 R2 Rn

Client 2

State Client 1 State Client 2 R2 Server State Representation

Tuesday, October 6, 2009

into Resource or Client State


Client 1

C1 R1

C1

Server

C1 R1
C2

C1 R2

C2

Rn

Client 2

R2
C2 C2

State Client 1 State Client 2 Server State Representation

Tuesday, October 6, 2009

Resources
Nothingham, Mark: The State of Proxy Caching http://www.mnot.net/blog/2007/06/20/proxy_caching Nottingham, Mark: The State of Browser Caching http://www.mnot.net/blog/2006/05/11/browser_caching Nottingham, Mark: Caching Tutorial http://www.mnot.net/cache_docs/ Squid, http://www.squid-cache.org/ Nottingham, Mark: Cache Channels for Squid http://www.mnot.net/cache_channels/ The Varnish Project, http://varnish.projects.linpro.no/ Varnish: Notes from the Architect http://varnish.projects.linpro.no/wiki/ArchitectNotes Tomoyako, Ryan: Things Caches Do http://tomayko.com/writings/things-caches-do W3C, ESI Language Specication 1.0 http://www.w3.org/TR/esi-lang Apache HTTP 2.2 Caching Guide http://httpd.apache.org/docs/2.2/caching.html
Tuesday, October 6, 2009

You might also like