36
Pages That Pop, Through Layered Cache Techniques

Edge 2016 pages that pop through layered cache techniques

Embed Size (px)

Citation preview

Pages That Pop, Through Layered Cache Techniques

© AKAMAI - EDGE 2016

Grow revenue opportunities with fast, personalized web experiences and manage complexity from peak demand, mobile devices and data collection.

Speed Matters

Akamai 101: CachingAkamai 201: Fast Purge, AJAX Fill-In, ESI, URL SpaceAkamai 301: Vary/Key, Edge-Control, PUSH, WebSockets

© AKAMAI - EDGE 2016

Caching Fundamentals

Edge closest to end-user

Edge closest to origin

Akamai Intelligent Platform

© AKAMAI - EDGE 2016

Organizing Content for Cacheability

● Personalization● Freshness

© AKAMAI - EDGE 2016

Organizing Content for Cacheability

● Personalization● Freshness

© AKAMAI - EDGE 2016

Freshness -- Frequency of Change

Zero -- Long TTL

Random, Not Urgent -- Medium TTL

Frequent -- Short TTL or no-store

Periodic -- Countdown TTL

Random, Urgent -- Same as Frequent, or Long TTL + Fast Purge NEW!

Bursty -- Same as Frequent, or Long TTL + Fast PurgeNEW!

© AKAMAI - EDGE 2016

How to Think About Fast Purge

Hold-til-Told

© AKAMAI - EDGE 2016

Personalization Separation

© AKAMAI - EDGE 2016

Base Page

AJAX Fill-In

CSS

Image

JavaScript

HTML Elements

JSON / XML

Image

© AKAMAI - EDGE 2016

AJAX Fill-In: Low Origin Traffic

AJAX RequestBase HTML,

Cached Objects

© AKAMAI - EDGE 2016

ESI (Base Page)

Dynamic Page Assembly (Edge Server Includes)

CSS

Image

JavaScript

HTML Elements

ESI Directives

© AKAMAI - EDGE 2016

Dynamic Page Assembly: Low Origin Traffic

Base ESI, Cached Objects

Snippet Request

© AKAMAI - EDGE 2016

Contents of AJAX Responses

JSON / XML

JSON / XML

JSON / XML

JSON / XML

JSON / XML

JSON / XML ● Per Page○ Flurry for small answers

vs.○ Consolidated answer

● Consider A/B Testing

© AKAMAI - EDGE 2016

Contents of AJAX Responses

JSON / XML

JSON / XML

JSON / XML

JSON / XML

JSON / XML

JSON / XML ● Per API Call○ Filter on server (less bytes)

vs.○ Filter on client (more bytes)

● Consider A/B Testing

© AKAMAI - EDGE 2016

Activate EdgeStart on TTL-Polluted Pages

Base Page

CSS

Image

JavaScript

HTML ElementsSend "first stuff"while fetching

dynamic remainder

© AKAMAI - EDGE 2016

Prefetch: Head Start on Traffic

Get Dynamic HTML, Send Start

Request full HTML

© AKAMAI - EDGE 2016

Prefetch & H2 Push for Cacheable Assets

Base Page

CSS

Image

JavaScript

HTML Elements

Have the Edge get objects early.With H2, push objects before

requested.

© AKAMAI - EDGE 2016

Prefetch: Head Start on Traffic

Get HTMLHTML, Then Objects

© AKAMAI - EDGE 2016

Pushed assets sit in client cacheH2 PUSH: Head Start on Traffic

Get HTML,Push More

© AKAMAI - EDGE 2016

H2 PUSH

● Part of the HTTP/2 protocol.● Obviously a successful push yields instant load!● Best times for PUSH:

○ If a dynamic base page is requested, while origin is being asked for it.○ After a page & objects are loaded, before the next click.

© AKAMAI - EDGE 2016

Client Cache

Corporate Proxy

Transparent Proxy

Caching Venues

Origin

CDN (Multiple)

APP

DATA

MEMCACHE

HTTP CACHE

CDN

High Control High Control

Standards

© AKAMAI - EDGE 2016

Using Edge-Control Header

// set CDN cache to 60 days, no other cache

res.writeHead(200, {'Content-Type': mimeType,

'Content-Length': contents.length,

'Cache-Control': 'private, no-store, no-cache, max-age=0',

'Edge-Control': 'max-age=60d',

});

// set CDN cache to 60 days, proxies to not cache, client to cache for an hour

res.writeHead(200, {'Content-Type': mimeType,

'Content-Length': contents.length,

'Cache-Control': 'private',

'Edge-Control': '!no-store, max-age=60d, downstream-ttl=1h',

});

// set CDN cache to 60 days, proxies to caches to 30 secs, client caches to 1 hour

res.writeHead(200, {'Content-Type': mimeType,

'Content-Length': contents.length,

'Cache-Control': 's-maxage=30, max-age=1h',

'Edge-Control': 'max-age=60d',

});

© AKAMAI - EDGE 2016

// will be cached by Akamai:

Vary: Accept-Encoding

// will not be cached by Akamai:

Vary: Accept-Encoding,Referer

Vary: User-Agent

Vary: Cookie

// occasionally appropriate to work around, e.g.:

X-Vary: Cookie

// ...apply metadata to use the cookie value

// in the cache key and move X-Vary to Vary

Vary: Cookie

// language is a common case:

Vary: Accept-Encoding,Accept-Language

// ...but consider creating language folders

Vary Header

● Vary is a necessary evil.● From origin to Akamai, Vary can pollute a

page as uncacheable (other than Accept-Encoding).

● Important for SEO to emit from Edge.● Sometimes work around this in metadata.● Consider a URL space redesign.

© AKAMAI - EDGE 2016

// cache on cookies with names '_sess' and 'ID'

Vary: Cookie

Key: Cookie;param=_sess;param=ID

// vary on galaxy note 7

Vary: User-Agent

Key: User-Agent;substr=SM-N930F

...tell the user to turn off their phone!...

// interpret Foo as a numeric and put into buckets:

Key: Foo;partition=20:30:40

Foo: 11 → < 20

Foo: 18 → 0-20

Foo: 20 → 20-30

Foo: 25 → 20-30

Foo: 30 → 30-40

Foo: 80 → >= 40

Future: Key Header

● Key is the new Vary.● Spec by Mark Nottingham of Akamai.● Subexpressions to cover more realistic

use-cases with broader buckets.

© AKAMAI - EDGE 2016

Content Negotiation Tips

● When your CDN can translate inline some negotiable aspect, it's not an issue.○ e.g. Akamai can apply/remove gzip at the Edge.○ Brotli is too new for this treatment at the moment.

● Setup cache keys to accommodate, or separate URL space.○ e.g. human languages and newer encodings.○ Flatten the URL space to 1:1 between a URL and a stream of bytes.

© AKAMAI - EDGE 2016

Base Page

WebSockets: Live Updates

CSS

Image

JavaScript

HTML Elements

WebSocket Frame

WebSocket Frame

WebSocket Frame

© AKAMAI - EDGE 2016

WebSocketRouting

WebSocket to Origin

WebSockets: Live Updates

© AKAMAI - EDGE 2016

Thank You!

© AKAMAI - EDGE 2016

Grow revenue opportunities with fast, personalized web experiences and manage complexity from peak demand, mobile devices and data collection.

Consumers Expect Pages That Pop

49%Expect <2 second page load times

30%Expect <1 second page load times

18%Expect instant

page load times!

Source: Akamai

© AKAMAI - EDGE 2016

Public vs Personalized

PERSONALIZEDPUBLIC

© AKAMAI - EDGE 2016

FAST PURGE IS LIVE IN LIMITED AVAILABILITY!

● ~5-second invalidate and delete of individually specified urls via API and UI

● Over 100X throughput compared with our legacy purge capabilities

● Already enabled on all customer accounts

● Coming in Q1, 2017:○ Fast Purge by cpcode○ Fast Purge by content tag

Cache your semi-dynamic content, and respond near instantly as soon as it changes with Fast Purge.

© AKAMAI - EDGE 2016

Fast Purge Allows Full Offload When Quiet

Quiet Time!

Theoretical Load

© AKAMAI - EDGE 2016

URL Space Organization

● /img/hero-12345.jpg● /css/styles-main.css

○ Easily cached● /blah/(index.*)

○ If possible, have index.html be cached: use AJAX fill-in or ESI.● /api/blah*

○ If possible, test separation of API response data on cacheability grounds rather than letting one piece of the response pollute the entire response to no-store.

● /files/by/group*○ Organize files into groups such that clients are likely to grab bundles matching

exactly what they need.

© AKAMAI - EDGE 2016

EdgeStart Waterfall

© AKAMAI - EDGE 2016

Future: Brotli Compression

● Brotli is a new compression algorithm developed by Jyrki Alakuijala and Zoltán Szabadka of Google.

● Brotli has levels of compression: 6 and 11 are of particular note.

● Until the CDN can translate gzip/brotli live then consider the hit to cacheability along with the file size.

● Brotli 11 assets will probably always be pre-generated and stored.

// new encoding

Accept-Encoding: gzip,br

Encoding: br