Skip to content

ADR-008: KV Cache voor Publieke Site (ISR Pattern)

Cloudflare KV als edge-cache laag voor de publieke site. Public site leest uit KV (~1ms), valt terug naar Supabase bij miss (~80-150ms), en vult KV na succesvolle fallback (write-on-miss). KV wordt instant geïnvalideerd bij content-mutaties.

De publieke site deed bij elke request 2-5 Supabase queries (~80-150ms per stuk). Met CDN edge cache (s-maxage=300) was de TTFB acceptabel, maar na cache expiry of purge moest elke bezoeker wachten op de database. Bij schaal naar 500+ sites wordt dit een bottleneck.

OptieVoordeelNadeel
KV cache (gekozen)~1ms reads, instant invalidatie, geen infra overheadKV eventual consistency (~60s cross-region)
Neon read replicaSQL-compatibel, geen applicatiewijzigingMigratierisico, hogere kosten ($69/mo)
Langere CDN TTLSimpelstStale content tot 5-10 min na publicatie
Full static generationSnelstHele site rebuilden bij 1 wijziging
Bezoeker → CDN (edge cache) → Astro SSR → KV (~1ms)
│ miss?
Supabase → response + KV vullen
Editor slaat op → API → Supabase write
→ KV delete (instant invalidatie)
→ CDN purge (bestaand)

KV key schema:

KeyInhoudTTL
host:{hostname}Site context (siteId, ownerId, siteSlug)24h
site:{siteId}Site config + menus + nav + logo24h
page:{siteId}:{slug}Page data (blocks, SEO, settings)24h
brand-css:{siteId}Pre-generated CSS string24h

Invalidatie-triggers:

TriggerKV actie
Page opslaan/verwijderenDelete page: + site:
Brand update/restoreDelete brand-css:
Menu/nav wijzigingDelete site:
Domein wijzigingDelete host:
Site soft-deleteDelete site: + host: entries
Pattern propagatieDelete affected page: keys
  • TTFB ~100ms → ~1-5ms voor 95%+ requests (KV hit)
  • DB load -95% — Supabase alleen bij eerste bezoek na publicatie
  • Instant freshness — KV wordt verwijderd vóór de response naar de editor teruggaat
  • Graceful degradation — zonder KV binding (local dev) werkt alles via Supabase
  • KV eventual consistency — cross-region propagatie ~60s (beter dan huidige 300s CDN)
  • Geen waitUntil() in Astro — write-on-miss is await’ed (~10-20ms, alleen bij miss)
  • Nieuwe API endpointPOST /cache/invalidate voor dashboard-side KV invalidatie
  • Gedeelde KV namespaceBEAM_CACHE gebonden aan zowel API Worker als CF Pages