Slide 1

Slide 1 text

Edge Side APIs A new pattern to build fast and reliable web APIs A new pattern to build fast and reliable web APIs

Slide 2

Slide 2 text

Kévin Dunglas ➔ Co-founder of Les-Tilleuls.coop ➔ Creator of: ● API Platform: API-first framework ● Vulcain.rocks: client-driven hypermedia APIs ● Mercure.rocks: async and real-time APIs ➔ Symfony Core Team @dunglas

Slide 3

Slide 3 text

API, cloud, PHP and JS experts ➔ Scop, 100% employee-owned ✊ ➔ Democratically managed 💬 ➔ 55 people 🦄 ➔ Lille, Paris, Nantes, Lyon 🌎 ➔ [email protected] 💌 Les-Tilleuls.coop

Slide 4

Slide 4 text

➔ REpresentational State Transfer: a network of linked web resources ➔ The architectural style of the web itself ➔ Internet-scale distributed hypermedia systems ➔ Designed for scalability, performance, simplicity and security ➔ Constraints: client–server, statelessness, cacheability, layered system, code on demand, uniform interface ➔ Specs: URI, HTTP, RDF, JSON-LD, Hydra REST(ful) © Nordic APIs

Slide 5

Slide 5 text

What Has Changed Since the 2000s?

Slide 6

Slide 6 text

Standards

Slide 7

Slide 7 text

HTTP/2 & HTTP/3 ➔ Multiplexing: ability to download many resources in parallel ➔ Binary protocols ➔ Headers compression and deduplication ➔ Stream prioritization ➔ TLS 1.3: 0-RTT resumption ➔ QUIC: No head-of-line blocking (especially useful on slow mobile networks) @dunglas

Slide 8

Slide 8 text

HTTP/2 @ Forum PHP 2018 HTTP/3 @ AFUP Day 2021

Slide 9

Slide 9 text

HTTP Cache © MDN

Slide 10

Slide 10 text

Expiration ➔ max-age: duration the resource is considered fresh ➔ s-maxage: same, for shared caches Validation ➔ ETag: ID of a version of a resource ➔ Last-Modified: last modification date Invalidation (not standardized) ➔ Purge stale versions ● xkey / ykey (Varnish) ● Surrogate-Key (Fastly) ● Cache-Tags (Cloudflare / API Platform) HTTP cache

Slide 11

Slide 11 text

HTTP Cache: new New Cache-Control directives (extensions): ➔ immutable: the resource will never change ➔ stale-while-revalidate: use a stale response while asynchronously checking for a fresh one ➔ stale-if-error: use a stale response if the server returns an error @dunglas

Slide 12

Slide 12 text

Infrastructure

Slide 13

Slide 13 text

Content Delivery Network ➔ Servers all over the world ➔ Stores static files ● images, videos, JS, HTML... ➔ As close as possible of end users ● Low response times ● Reduced bandwidth usage CDN

Slide 14

Slide 14 text

➔ Huge cache with distributed nodes ➔ Providers: Fastly, Akamai, Cloudflare… ➔ Build your own: ● Distributed HTTP cache ○ Souin (free software 󰏃) ○ Varnish Enterprise ● anycast DNS and GeoDNS ○ GeoDNS (free software) ○ PowerDNS (free software) CDN

Slide 15

Slide 15 text

➔ Similar to CDNs ➔ But can also execute code ➔ Serverless functions: Vercel, AWS Lambda@Edge, Cloudflare Workers ➔ Docker containers: Fly.io ➡ Edge Code (distributed, ex: auth) ➥ Edge Cache (distributed) ➥ Origin (centralized, ex: main business logic) ➔ Or totally distributed: run PHP at edge! Edge Computing

Slide 16

Slide 16 text

Lessons Learned From the Frontend

Slide 17

Slide 17 text

➔ An architecture for frontend development ➔ JAM: JavaScript, APIs, Markup ➔ As much HTML as possible is pre-built ➔ The resulting static files are stored at the edge of the network, in a Content Delivery Network (CDN) ➔ Benefits: performance and scalability ➔ JAMstack is used by default for the frontend part of API Platform (Next.js) JAMstack © jamstack.org

Slide 18

Slide 18 text

Static Site Generation (SSG) aka JAMstack ➔ ahead of time (build time) ➔ statics files stored at edge (CDN) Incremental Static Regeneration (ISR) ➔ on demand (runtime) ➔ documents refreshed at expiration or invalidation ➔ static files generated and stored at edge ➔ code executed at edge (edge computing) ➔ faster builds and higher cache rate Generation strategies

Slide 19

Slide 19 text

ISR + SWR (stale while revalidate)

Slide 20

Slide 20 text

Introducing Edge Side APIs

Slide 21

Slide 21 text

➔ An architecture for API development ➔ Resources served by the API can be pre-built ➔ Generated static JSON documents are stored at the edge of the network, in a Content Delivery Network (CDN) ➔ Responses can be generated at edge (edge computing) ➔ Benefits: ● performance ● scalability ● reliability ESA: Edge Side APIs

Slide 22

Slide 22 text

ESA: Back to The Basics ➔ ESA can be written in any language: ● PHP 😍, JS, Rust, Go, LISP or anything else ➔ ESA embraces the REST principles ➔ The name is a wink to the good old ESIs… ➔ ...and to Thomas Pesquet ➔ ESA will be the core architecture of API Platform 3.0! @dunglas

Slide 23

Slide 23 text

ESA: Architectural Constraints

Slide 24

Slide 24 text

➔ Pre-generate as much API responses as possible ➔ Store the API responses in a CDN ➔ On write, re-generate (or invalidate) all the API responses impacted by the change ➔ Optional: run code at edge Benefits ➔ Performance ➔ Scalability and reliability ➔ Less energy consumption 1. Pre-generate

Slide 25

Slide 25 text

➔ Serve small, atomic documents ➔ Don’t embed related resources, link them (hypermedia) ➔ Split big resources using one-to-one relations Benefits ➔ Developer Experience: simpler (no serialization groups…) ➔ Better browser and share cache hit rate ➔ Clients fetch only what they need initially ➔ Relations fetching can be delayed (on click…) ➔ Less frequent re-generations / invalidations 2. Atomic Resources

Slide 26

Slide 26 text

2. Atomic Resources 🚫

Slide 27

Slide 27 text

2. Atomic Resources ✅

Slide 28

Slide 28 text

2. Atomic Resources ✅

Slide 29

Slide 29 text

➔ The API must be usable by any client on any device (think curl + jq or raw TCP sockets) ➔ Capable clients can leverage optional features such as cache, preloading, HTTP/3 or push, for better performance and UX Benefits ➔ Works everywhere, even on old devices, in scripts… ➔ Top notch UX and perf with modern browsers/devices Reminder: to reduce the digital environmental footprint, we must build fewer devices and use them longer! 3. Progressive

Slide 30

Slide 30 text

➔ Preload initially relations needed ➔ Use Preload links (optionally with 103 Early Hints)... ➔ ...or HTTP/2 Server Push ➔ Allow clients informing the API of what relations they need: Vulcain, Prefer-Push Benefits ➔ Mitigate the n+1 problem ➔ Reduced latencies 4. Preload

Slide 31

Slide 31 text

4. Preload

Slide 32

Slide 32 text

Vulcain @ AFUP Day 2021

Slide 33

Slide 33 text

➔ Clients can subscribe to real-time updates ➔ On write, new versions of the resources are pushed (do it when re-generating) ➔ Use Mercure, SSE, Websockets and/or WebSub Benefits ➔ Clients are always up to date ➔ UX: user interfaces update in real-time ➔ Less energy consumption: no polling 5. Push

Slide 34

Slide 34 text

5. Push

Slide 35

Slide 35 text

Mercure @ Forum PHP 2019

Slide 36

Slide 36 text

@dunglas Preload Pre-generate 2 3 Constraints 4 5 1 Atomic Resources Progressive Push

Slide 37

Slide 37 text

ESA: Tooling

Slide 38

Slide 38 text

Tooling PHP API Platform ● iri_only ● cache invalidation (PurgerInterface) FOSS Servers Caddy ● Souin ● Mercure ● Vulcain JavaScript ● Ketting ● Vercel SWR ● React Query Providers supporting PHP ● Fly.io (Docker) ● Vercel ● Lambda@Edge

Slide 39

Slide 39 text

Thank you, thanks AFUP! ➔ Any questions?