Caching the Uncacheable [Long Version]

101
Caching The Uncacheable Leveraging Your CDN To Cache Dynamic Content Hooman Behesh+, VP Technology

description

(Surge 2014) This is a longer version of our Velocity 2014 slides around caching dynamic content. Topic: In the past, CDNs have been used to cache and distribute static objects. But issues around invalidation, staleness, and lack of visibility have prevented us from using CDNs to fully leverage the benefits of caching when it comes to dynamic content. Today, using a real-time, modern CDN that provides instant cache invalidation and real-time analytics allows for instantaneous control over dynamic content caching.

Transcript of Caching the Uncacheable [Long Version]

Page 1: Caching the Uncacheable [Long Version]

Caching  The  Uncacheable    

Leveraging  Your  CDN  To  Cache  Dynamic  Content  

Hooman  Behesh+,  VP  Technology  

Page 2: Caching the Uncacheable [Long Version]

Dynamic  Content  Is  Really  Interes<ng!  

Page 3: Caching the Uncacheable [Long Version]

What  Is  Dynamic  Content?  

•  Stuff  that’s  not  sta+c!  •  With  web  traffic,  generally  the  base  HTML  –  Big  deal  because  it’s  blocking  –  And  some+mes  a  large  object  à  longer  download  

Page 4: Caching the Uncacheable [Long Version]
Page 5: Caching the Uncacheable [Long Version]

Blocking  

Page 6: Caching the Uncacheable [Long Version]
Page 7: Caching the Uncacheable [Long Version]
Page 8: Caching the Uncacheable [Long Version]

What  Is  Dynamic  Content?  •  Stuff  that’s  not  sta+c!  •  With  web  traffic,  generally  the  base  HTML  –  Big  deal  because  it’s  blocking  –  And  some+mes  a  large  object  à  longer  download  

•  Could  be  other  things  too  –  AJAX  calls  –  API  calls  

•  More…  

Page 9: Caching the Uncacheable [Long Version]

Classically,  with  dynamic  content…  

Caching  

Page 10: Caching the Uncacheable [Long Version]

Dynamic  Content  Caching  Problems  

•  Serving  stale  pages  – Lack  of  good  invalida+on  framework  

 

Page 11: Caching the Uncacheable [Long Version]

Caching    vs.    

Invalida<on  

Page 12: Caching the Uncacheable [Long Version]
Page 13: Caching the Uncacheable [Long Version]
Page 14: Caching the Uncacheable [Long Version]
Page 15: Caching the Uncacheable [Long Version]

We  tried…  

Page 16: Caching the Uncacheable [Long Version]

Dynamic  Content  Caching  Problems  

•  Serving  stale  pages  – Lack  of  good  invalida+on  framework  

 

Page 17: Caching the Uncacheable [Long Version]

Dynamic  Content  Caching  Problems  

•  Serving  stale  pages  – Lack  of  good  invalida+on  framework  

•  Real-­‐+me  visibility  – Real-­‐+me  analy+cs/stats  – Real-­‐+me  logging/tracking  

 

Page 18: Caching the Uncacheable [Long Version]

So…  

Caching  

Page 19: Caching the Uncacheable [Long Version]

CDNs  and  Dynamic  Content  

•  Generally,  handling  dynamic  content  has  been  a  maRer  of  transport  – Op+mize  from-­‐origin  delivery  – “DSA”  (Dynamic  Site  Accelera+on)  – Middle  mile  op+miza+ons  – TCP  tweaks  

 

Page 20: Caching the Uncacheable [Long Version]

Dynamic  Content,  Tradi<onally  

CDN  Node  

Client  

Origin  

Some  TCP  Tweaks  

Page 21: Caching the Uncacheable [Long Version]

Dynamic  Content,  Tradi<onally  

CDN  Node   CDN  Node  

Client  

Origin  

Lots  of  TCP  Tweaks  

Page 22: Caching the Uncacheable [Long Version]

Dynamic  Content,  Tradi<onally  

•  We  some+mes  do  micro  caching  of  HTML  –  Short  TTL  for  HTML  content  via  Cache-­‐Control  – Not  full  proof  

•  Ex:  news  stories  faux-­‐pas!  

•  ESI  (Edge  Side  Includes)  –  Par+al  caching  – Hard  and  onerous  

 

Page 23: Caching the Uncacheable [Long Version]

Actually…  

•  Dynamic  content  is  more  cacheable  than  we  think  

•  Sta+c  for  shorter  periods  of  +me  

•  Unpredictable  invalida+on  –  Standard  HTTP  caching  rules  aren’t  good  enough  

Page 24: Caching the Uncacheable [Long Version]

A  Lot  BeLer!  

CDN  Node   CDN  Node  

Client  

Origin  

Page 25: Caching the Uncacheable [Long Version]

No  CDN  

Page 26: Caching the Uncacheable [Long Version]

CDN  (sta<c)  

Page 27: Caching the Uncacheable [Long Version]

Blocking  CDN  

(sta<c)  

Page 28: Caching the Uncacheable [Long Version]

CDN  (sta<c)  

Page 29: Caching the Uncacheable [Long Version]

CDN  (sta<c  

+  dynamic)  

Page 30: Caching the Uncacheable [Long Version]

So  Many  Benefits!  

•  Performance  –  Faster  +me  to  first  byte  –  Faster  start  render  – Happy  users!  

•  Offload  –  Less  work  for  our  servers  –  Less  bandwidth  at  origin  

Page 31: Caching the Uncacheable [Long Version]

What  would  make  it  beLer?  

Page 32: Caching the Uncacheable [Long Version]

Programma<c  Invalida<on  

•  Invalida+on  API  

•  Granular  –  Specific  URL  – URL  groups  – All  –  Etc…  

 

Page 33: Caching the Uncacheable [Long Version]

Purge  •  As  a  page  gets  published/updated,  a  purge  command  also  gets  published  

•  Must  be  Instant!  

•  Big  problem  with  classic  CDNs    –  mul+-­‐minute  purges!  –  Ex:  News  story,  part  2  

Page 34: Caching the Uncacheable [Long Version]

Instant?  

•  IS  NOT:  –  12  minutes!  –  quick  acknowledgment!  

•  IS:  –  <1sec  –  predictable  and  determinis+c  behavior  –  (has  to  also  include  propaga+on)  

Page 35: Caching the Uncacheable [Long Version]

Power  of  the  Purge!  

•  Purge  dependencies  – Surrogate  Keys  – Using  tags/labels  to  purge  en+re  chunks  of  content  at  once  

 

Page 36: Caching the Uncacheable [Long Version]

Not  totally  obsolete!  

Page 37: Caching the Uncacheable [Long Version]

Example:  CMS  +  Purge  

Page 38: Caching the Uncacheable [Long Version]

WordPress:  Before  

CDN  Node  

Page 39: Caching the Uncacheable [Long Version]

WordPress:  Before  

CDN  Node  

Page 40: Caching the Uncacheable [Long Version]

WordPress:  Before  

CDN  Node  

Page 41: Caching the Uncacheable [Long Version]

WordPress:  Before  

CDN  Node  

Page 42: Caching the Uncacheable [Long Version]

WordPress:  Before  

CDN  Node  

Cache  

Page 43: Caching the Uncacheable [Long Version]
Page 44: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  

Page 45: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  

HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 55,666Cache-Control: Totally Long Time!

Page 46: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  

HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 55,666Cache-Control: Totally Long Time!

Page 47: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  

Page 48: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  

Page 49: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  PURGE  

Page 50: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  PURGE  

Page 51: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  

(Has  to  be  instantaneous!)  

PURGE  

Page 52: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  

HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 55,666Cache-Control: Totally Long Time!

Page 53: Caching the Uncacheable [Long Version]

WordPress:  AVer  

CDN  Node  

Page 54: Caching the Uncacheable [Long Version]

Example:  customer1.js  

Page 55: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

(Referer: www.customer1.com)

Page 56: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

Page 57: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  

HTTP/1.1 200 OKCache-Control: max-age=60Last-Modified: Wed, 24 Sep 2014 19:51:30 GMTContent-Type: application/javascriptDate: Thu, 25 Sep 2014 12:22:20 GMTServer: ApacheContent-Length: 7835

http://www.3rdparty.com/customer1.js

Page 58: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  

HTTP/1.1 200 OKCache-Control: max-age=60Last-Modified: Wed, 24 Sep 2014 19:51:30 GMTContent-Type: application/javascriptDate: Thu, 25 Sep 2014 12:22:20 GMTServer: ApacheContent-Length: 7835

http://www.3rdparty.com/customer1.js

Page 59: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  

HTTP/1.1 200 OKCache-Control: max-age=60Last-Modified: Wed, 24 Sep 2014 19:51:30 GMTContent-Type: application/javascriptDate: Thu, 25 Sep 2014 12:22:20 GMTServer: ApacheContent-Length: 7835

http://www.3rdparty.com/customer1.js

Page 60: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

(Ager  1  min)  

Page 61: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js VALIDATION

If-Modified-Since: Wed, 24 Sep 2014 19:51:30 GMT

(Ager  1  min)  

Page 62: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

304 Not Modified

(Ager  1  min)  

Page 63: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

304 Not Modified

(Ager  1  min)  

Page 64: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

Page 65: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

Page 66: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  

HTTP/1.1 200 OKCache-Control: max-age=60, s-maxage=2592000Last-Modified: Wed, 24 Sep 2014 19:51:30 GMTContent-Type: application/javascriptDate: Thu, 25 Sep 2014 12:22:20 GMTServer: ApacheContent-Length: 7835

http://www.3rdparty.com/customer1.js

Page 67: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  

HTTP/1.1 200 OKCache-Control: max-age=60, s-maxage=2592000Last-Modified: Wed, 24 Sep 2014 19:51:30 GMTContent-Type: application/javascriptDate: Thu, 25 Sep 2014 12:22:20 GMTServer: ApacheContent-Length: 7835

http://www.3rdparty.com/customer1.js

Page 68: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  

HTTP/1.1 200 OKCache-Control: max-age=60, s-maxage=2592000Last-Modified: Wed, 24 Sep 2014 19:51:30 GMTContent-Type: application/javascriptDate: Thu, 25 Sep 2014 12:22:20 GMTServer: ApacheContent-Length: 7835

http://www.3rdparty.com/customer1.js

Page 69: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

(Ager  1  min)  

Page 70: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

(Ager  1  min)  

Page 71: Caching the Uncacheable [Long Version]

This  happens  many  many  <mes!  (many  many  happy  visitors!)  

Page 72: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  

Customer1  changes  config  

(Ager  1  min)  

Page 73: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  PURGE  customer1.js  

Customer1  changes  config  

(Ager  1  min)  

Page 74: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  PURGE  customer1.js  

Customer1  changes  config  

(Ager  1  min)  

Page 75: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

(Ager  1  min)  

Page 76: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  http://www.3rdparty.com/customer1.js

HTTP/1.1 200 OKCache-Control: max-age=60, s-maxage=2592000Last-Modified: Wed, 24 Sep 2014 19:51:30 GMTContent-Type: application/javascriptDate: Thu, 25 Sep 2014 12:22:20 GMTServer: ApacheContent-Length: 7835

(Ager  1  min)  

Page 77: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  

HTTP/1.1 200 OKCache-Control: max-age=60, s-maxage=2592000Last-Modified: Wed, 24 Sep 2014 19:51:30 GMTContent-Type: application/javascriptDate: Thu, 25 Sep 2014 12:22:20 GMTServer: ApacheContent-Length: 7835

http://www.3rdparty.com/customer1.js

(Ager  1  min)  

Page 78: Caching the Uncacheable [Long Version]

More  than  just  Invalida<on…  

Page 79: Caching the Uncacheable [Long Version]

The  Influence  of  Clouds  

•  The  CDN  is  an  extension  of  the  app  •  No  longer  a  black  box  •  Real-­‐+me  integra+on  with  the  app  •  Infrastructure  as  code  – Your  content  =>  You  need  control  

Page 80: Caching the Uncacheable [Long Version]

Control  

•  Programmability  – Configura+on  API  –  Invalida+on  API  –  Instantaneous  and  real  +me  

Page 81: Caching the Uncacheable [Long Version]

Caching  Control  

•  Granular  caching  – Dynamic  caching  – flexible  cache  keys  – etc  

•  Ex:  Geo-­‐based  caching  

Page 82: Caching the Uncacheable [Long Version]

Control  at  the  Edge  

•  Moving  app  logic  to  the  edge  •  VCL  – Varnish  Configura+on  Language  – Script-­‐like  configura+on  for  func+onality  at  the  edge  

Page 83: Caching the Uncacheable [Long Version]

Visibility  

•  Real  +me  analy+cs  – Network  stats  – HTTP  stats  (status  codes  ,  etc)  –  Caching  stats  (hits,  misses,  etc)  –  Stats  API  

•  Logging  –  Real  +me  logs  –  Streaming  to  various  log  des+na+ons  

Page 84: Caching the Uncacheable [Long Version]

Example:  Beacon  Termina<on  at  the  Edge  

Page 85: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  

Log  Analysis  

http://collector.site.com/beacon.img?a=1&b=2&c=3

Page 86: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  

Log  Analysis  

http://collector.site.com/beacon.img?a=1&b=2&c=3

Page 87: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  

Log  Analysis  

HTTP/1.1 200 OKPragma: no-cacheExpires: Wed, 19 Apr 2000 11:43:00 GMTCache-Control: no-cache, no-storeLast-Modified: Wed, 21 Jan 2004 19:51:30 GMTContent-Type: image/gifDate: Fri, 20 Jun 2014 12:22:20 GMTServer: ApacheContent-Length: 35

http://collector.site.com/beacon.img?a=1&b=2&c=3

Page 88: Caching the Uncacheable [Long Version]

Before  

CDN  Node  

Origin  

Log  Analysis  

HTTP/1.1 200 OKPragma: no-cacheExpires: Wed, 19 Apr 2000 11:43:00 GMTCache-Control: no-cache, no-storeLast-Modified: Wed, 21 Jan 2004 19:51:30 GMTContent-Type: image/gifDate: Fri, 20 Jun 2014 12:22:20 GMTServer: ApacheContent-Length: 35

http://collector.site.com/beacon.img?a=1&b=2&c=3

Page 89: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  http://collector.site.com/beacon.img?a=1&b=2&c=3

Page 90: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  

HTTP/1.1 200 OKPragma: no-cacheExpires: Wed, 19 Apr 2000 11:43:00 GMTCache-Control: no-cache, no-storeLast-Modified: Wed, 21 Jan 2004 19:51:30 GMTContent-Type: image/gifDate: Fri, 20 Jun 2014 12:22:20 GMTServer: ApacheContent-Length: 35

http://collector.site.com/beacon.img?a=1&b=2&c=3

Page 91: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  

HTTP/1.1 204 No ContentDate: Sat, 21 Jun 2014 23:21:12 GMTServer: Awesome ServerContent-Length: 0

http://collector.site.com/beacon.img?a=1&b=2&c=3

Page 92: Caching the Uncacheable [Long Version]

AVer  

CDN  Node  

Origin  

Syslog  /  S3  /  FTP/etc  

http://collector.site.com/beacon.img?a=1&b=2&c=3

Page 93: Caching the Uncacheable [Long Version]

Example:  Edge-­‐generated  Content  

Page 94: Caching the Uncacheable [Long Version]

JSON  Data  Center  ID  

CDN  Node  

Origin  http://www.site.com/which_datacenter.js

Page 95: Caching the Uncacheable [Long Version]

JSON  Data  Center  ID  

CDN  Node  

Origin  

{ ‘datacenter’ : ‘SJC’ }

http://www.site.com/which_datacenter.js

Page 96: Caching the Uncacheable [Long Version]

VCL  Snippet  

Page 97: Caching the Uncacheable [Long Version]

JSON  Geo  IP  

CDN  Node  

Origin  

{ “city” : “New York”, “state”: “New York”, “country”: “United States”, “ip”: “173.18.14.237”}

http://www.site.com/geo_ip.js

Page 98: Caching the Uncacheable [Long Version]

More  Examples  

•  Caching  with  tracking  cookies:  –  hRp://www.fastly.com/blog/how-­‐to-­‐cache-­‐with-­‐tracking-­‐cookies  

•  API  Caching:  –  hRp://www.fastly.com/blog/api-­‐caching-­‐part-­‐iii  (part  3,  with  links  to  previous  two  parts)  

•  Log  Streaming:  –  hRp://www.fastly.com/blog/+ps-­‐for-­‐streaming-­‐logs    

Page 99: Caching the Uncacheable [Long Version]

Let’s  Sum  Up!  

Page 100: Caching the Uncacheable [Long Version]

Summary  

•  Dynamic  content  can  be  cached  – We  need  instant  purging  – We  need  real-­‐+me  logs  and  stats  

•  Real-­‐+me  integra+on  of  our  CDN  with  our  app  is  cool!  –  Extensive/granular  API  to  control  the  CDN  –  Control  and  visibility  at  the  edge  lets  us  be  really  crea+ve  

•  Never  use  “Totally Long Time!” in  a  Cache-Control header!    

Page 101: Caching the Uncacheable [Long Version]

Thank  you!  

[email protected]