Slide 1

Slide 1 text

Dynamic Generation January 24, 2019 @ JAMstack NYC Meetup Sergey Chernyshev

Slide 2

Slide 2 text

Sergey Chernyshev Principal Engineer @ Meetup January 24, 2019 @ JAMstack NYC Meetup • Care about
 UX speed • Organize
 NY Web Performance Meetup Group • Work on
 Web Platform team @ Meetup

Slide 3

Slide 3 text

• No PHP/Python/Ruby/ Java/ASP.Net/Node runtime! • No servers! • No databases! • Faster for users! Why Do We Generate?

Slide 4

Slide 4 text

Server-side Rendering Speed

Slide 5

Slide 5 text

Server-side Rendering Speed

Slide 6

Slide 6 text

Server-Side Rendered HTML • 1240ms @ Average • 3910ms @ 95%ile Static Resources • 483ms @ Average • 629ms @ 95%ile Generation is Faster • Bottleneck for the whole page • Much faster on average • Significantly less variable

Slide 7

Slide 7 text

• Carousell: -65% page load => +63% SEO, 3x ad clicks (2019) • Pinterest: -40% wait time => +15% SEO, +15% conversion (2017) • DoubleClick: 5s vs 19s on mobile => 2x ad revenue (2016) • Trainline: -300ms latency => +$11.5M / year revenue (2016) • Etsy: +160Kb => +12% bounce rate (2014) • Mozilla: -2.2s => +15.4% Downloads (2010) • Google: +400ms => -0.21% searches after experiment! (2009) • Netflix: +GZip => -43% Traffic cost (2008) • Amazon: +100ms => -1% revenue (2008) • Google: +500ms => -25% searches (2006) Stats @ WPOstats.com

Slide 8

Slide 8 text

Edge Cache vs. Generation

Slide 9

Slide 9 text

HTML Edge Cache

Slide 10

Slide 10 text

HTML Generation Workflow

Slide 11

Slide 11 text

• Renders on Read • Time To Live (TTL) • Stale for TTL/2 time • Cache hit ratio < 100% • Needs origin for misses • Renders on Write • Infinite TTL • Stale until updated • 100% offload Cache Generation

Slide 12

Slide 12 text

HTML Edge Cache without Invalidation

Slide 13

Slide 13 text

HTML Edge Cache with Invalidation

Slide 14

Slide 14 text

• API call • stale-while-revalidate • Surrogate keys for dependency tracking • Cache evictions • Shared CDN nodes • Long tail content • Deployment is invalidation • Serve stale while building • Incremental builds need dependency tracking • Storage & CPU cost $ • Each view is stored • Generates on write Invalidation ~ Generation

Slide 15

Slide 15 text

Static Generators
 with data in git Static with
 In-browser
 API calls Static Generators with API calls during build “Dynamic” Generators

Slide 16

Slide 16 text

Dynamic Generators

Slide 17

Slide 17 text

HTML Generation Workflow

Slide 18

Slide 18 text

Incremental Generation Workflow

Slide 19

Slide 19 text

• Maps changes to file names and edge cache keys • Sets renderer variables • auth / role • segmentation • language • Triggers incremental builds Dependency Manager

Slide 20

Slide 20 text

Dynamic Generation

Slide 21

Slide 21 text

Dynamic Generation Today

Slide 22

Slide 22 text

Dynamic Generation using GraphQL Subscriptions

Slide 23

Slide 23 text

• Know your real freshness / staleness requirements • Learn your existing data update cycle • Map data changes to outputs, list variations • Identify personalized vs. segmented content • Build your Dynamic Generator • Make your users happy! To Do

Slide 24

Slide 24 text

Thank You! Twitter: @sergeyche [email protected] SergeyChernyshev.com