Bir isteğin tarayıcıdan veritabanına kadar geçtiği cache katmanları nelerdir? Veri değiştiğinde hepsini nasıl tutarlı tutarsınız?
Cevap
Bir istek yolunda birden fazla cache katmanından geçer. Her katman latency'yi düşürür ama invalidation (geçersiz kılma) karmaşıklığını artırır. Temel kural: veri değiştiğinde hangi katmanların eski veriyi tuttuğunu ve ne kadar süre tutabileceğini bilmek.
Katmanlar
- Client state cache: TanStack Query, SWR, Apollo cache. Mutation sonrası
invalidateQueriesile yenilenir. - Tarayıcı HTTP cache:
Cache-Control,ETagile. Kullanıcıya özel veri içinprivate. - Service Worker cache: offline / PWA senaryolarında.
- CDN / edge cache:
s-maxage,stale-while-revalidate; purge API veya cache tag'leri ile temizlenir. - Framework cache: Next.js data cache, ISR;
revalidatePath/revalidateTagile. - Uygulama cache'i: Redis'te cache-aside (sorgu sonucu, session).
- Veritabanı: buffer pool, materialized view'lar.
Tutarlılık stratejisi
- Değişmeyen dosyalar: içerik hash'li dosya adları (
app.3f9a1c.js) +Cache-Control: public, max-age=31536000, immutable. Invalidation hiç gerekmez; yeni sürüm yeni ad demektir.index.htmliseno-cacheolmalıdır. - Herkese açık ama değişen veri (ürün sayfası): CDN'de kısa
s-maxage+stale-while-revalidate; ürün güncellenince cache tag ile purge. - Kullanıcıya özel veri: CDN'de cache'lenmez (
privateveyano-store); Redis'te kısa TTL. - Yazma sonrası: önce DB'ye yaz, sonra Redis anahtarını sil (güncellemek yerine silmek yarışları azaltır), sonra CDN tag'ini purge et, client'ta ilgili query'yi invalidate et.
Cache-Control: public, max-age=0, s-maxage=60, stale-while-revalidate=300
ETag: "v42"// Ürün güncelleme sonrası zincir
await db.product.update({ where: { id }, data });
await redis.del(`product:${id}`);
await cdn.purgeTags([`product-${id}`]);
// client: queryClient.invalidateQueries({ queryKey: ["product", id] })Tuzaklar
- Kullanıcıya özel yanıtın yanlışlıkla CDN'de cache'lenip başka kullanıcıya gösterilmesi (
Set-Cookieolan yanıtlar, eksikVarybaşlığı). Bu ciddi bir veri sızıntısıdır. - Her katmanda uzun TTL: toplam bayatlık süresi katmanların toplamına kadar çıkabilir.
- Cache stampede: popüler anahtarın süresi dolunca binlerce isteğin aynı anda DB'ye gitmesi; lock veya erken yenileme ile çözülür.
İlgili Web Mimarisi soruları
- SSR, SSG ve CSR arasındaki farklar nelerdir?
- Monorepo nedir? Avantajları, dezavantajları ve araçları nelerdir?
- MVC mimarisi nedir? Modern web uygulamalarında nasıl karşılık bulur?
- Bir kullanıcı girişinin uçtan uca akışını (frontend'den veritabanına) anlatın.
- Büyük dosya yükleme akışını nasıl tasarlarsınız? Presigned URL nedir?
- Backend for Frontend (BFF) deseni nedir, ne zaman kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.