2026 · Alene om utviklingen — API-et, cachingen og malfeltene designerne bygger mot

Kampdata i sanntid

Et cache-lag som lar annonser vise live-resultater uten å ta knekken på API-et bak dem.

  • Utvikling
  • Produkt
En annonse der du tipper en kamp i sidefeltet på en nettside, med to lag med flagg og live-prosenter

Oppdraget

Å vise live-stillingen i en annonse høres enkelt ut. Problemet er regnestykket. Fotballdata i sanntid kommer fra et betalt API som fakturerer per forespørsel og stopper deg etter noen få tusen kall om dagen, mens en annonsekampanje leverer millioner av visninger. Hvis hver visning spør API-et om stillingen, har du brukt opp dagsgrensen i løpet av de første minuttene av første kamp, og regningen blir absurd.

Så det interessante problemet er ikke å få tak i dataene. Det er å få dem ut til millioner av mennesker uten å spørre etter dem millioner av ganger.

Byggingen

Det er en Cloudflare Worker som sitter mellom annonsene og API-et bak, med en KV-cache ute i edge-nettverket. En annonse spør Workeren etter data, Workeren svarer fra cachen, og går bare videre til API-et når cachen har gått ut. Ett kall til API-et ender opp med å dekke hver eneste visning som havner i samme tidsvindu, og svaret fra cachen kommer tilbake på noen få millisekunder, uansett hvor personen befinner seg.

Hvor lenge ting ligger i cachen, er satt per endepunkt, fordi forskjellige ting blir utdaterte i forskjellig tempo. Live-resultater oppdateres hvert minutt. En serietabell kan ligge i femten. En kamp som er ferdig kommer ikke til å endre seg igjen, så den ligger i cachen i flere timer. Hvis API-et bak faller ut, serverer Workeren det siste den hadde i stedet for ingenting, ut fra tanken om at en litt gammel stilling er bedre enn en tom boks.

Det jeg er mest fornøyd med er likevel ikke cachingen. Feeden gir tilbake felt som allerede er formatert for visning, så en designer som bygger en annonse skriver {home.name} eller {display_time} i en mal og trenger aldri å tenke på API-et under. Tidspunkt for avspark kommer i riktig tidssone, lagnavn på riktig språk, og en kamp som pågår gir deg minuttet i stedet for starttidspunktet. Det er forskjellen på en datakilde folk kan bruke, og en de må spørre meg om.

En mindre ting jeg liker: på kampdager henter feeden kamper etter dato og ikke etter status, så en kamp forsvinner ikke fra widgeten i det øyeblikket den starter og går fra planlagt til live.

En annonse bygget på feeden, med to lag med flagg og live-prosenter i sidefeltet på en nettside

En ny sport

Ingenting av dette handler egentlig om fotball, og det var litt av poenget. Da vi ville ha basketball, var det stort sett en ny datakilde bak den samme cachen og de samme visningsfeltene, og nå dekker den 111 konkurranser for kvinner.

Det eneste som ikke ble med over, var scoringsøyeblikkene. Fotball gir deg målhendelser med minutt, så du kan starte en animasjon i det noen scorer. Basketballdataene har ingen løpende hendelser i det hele tatt, så det finnes ikke noe øyeblikk å reagere på. Det er en begrensning i kilden, ikke noe jeg kan kode meg rundt, og det virket verdt å skrive det rett ut i stedet for å la det være et hull folk stadig spør om.

Min rolle

Helt og holdent min. Workeren, cachingen, endepunktene og malfeltene annonsene bygges mot.

Resultatet

Den ble brukt i Coca-Colas VM-kampanje i Spania, og leverte live-kamper inn i annonsen på rundt 1,5 millioner visninger. Nesten alle ble servert fra cachen og ikke fra API-et bak, og det var hele poenget.