Okuma yükü için read replica eklediniz; kullanıcılar az önce kaydettikleri veriyi göremediklerini söylüyor. Neden olur ve nasıl çözersiniz?
Cevap
Bu, replication lag kaynaklı bir read-your-writes tutarlılık sorunudur. Yazma primary veritabanına gider, replikasyon asenkron olduğu için replica'ya birkaç milisaniye ile birkaç saniye arası geç ulaşır. Kullanıcı kaydettikten hemen sonra sayfa yenilenip okuma replica'dan yapılırsa eski veri görünür.
t=0 POST /profile -> primary: UPDATE users SET name='Ayşe'
t=5ms GET /profile -> replica: name='Ali' (henüz replike olmadı)Çözümler
- Yazandan sonra primary'den oku: kullanıcı yazma yaptıktan sonra belirli bir süre (ör. 5-10 sn) o kullanıcının okumaları primary'ye yönlendirilir. Son yazma zamanı session'da veya cookie'de tutulur.
- Kritik okumaları her zaman primary'den yap: kullanıcının kendi profili, sepeti, ödeme durumu. Replica'lar raporlar, listeler, herkese açık sayfalar için kullanılır.
- LSN/GTID takibi: yazmadan sonra primary'nin log pozisyonu (PostgreSQL'de LSN) alınır; okuma yapılacak replica bu pozisyona ulaşmamışsa primary'ye düşülür. Daha karmaşık ama kesin çözümdür.
- Yazma yanıtını kullan: API güncellenmiş kaydı yanıtta döner; frontend bunu cache'e yazar (TanStack Query
setQueryData) ve hemen yeniden fetch etmez. - Senkron replikasyon: tutarlılık sağlar ama yazma latency'sini artırır ve replica çökerse yazmaları durdurabilir; genelde sadece kritik verilerde tercih edilir.
// Basit yönlendirme: yazma yapan kullanıcı 10 sn boyunca primary'den okur
function dbFor(req) {
const lastWrite = Number(req.cookies.lw ?? 0);
return Date.now() - lastWrite < 10_000 ? primary : replica;
}İzleme
Replica gecikmesini metrik olarak izleyin (PostgreSQL'de pg_stat_replication, replay_lag) ve eşik aşılırsa replica'yı havuzdan geçici olarak çıkarın.
Aynı sorun cache katmanında da görülür (yazdıktan sonra eski cache'ten okumak); çözüm mantığı aynıdır.
İlgili Sistem Tasarımı soruları
- Dikey ve yatay ölçekleme arasındaki fark nedir?
- Hangi cache stratejilerini biliyorsunuz?
- REST ile GraphQL arasındaki farklar nelerdir?
- Bit.ly benzeri bir URL kısaltma servisi tasarlayın.
- Google Docs benzeri gerçek zamanlı ortak düzenleme yüksek seviyede nasıl tasarlanır?
- CDN nedir, nasıl çalışır ve hangi durumlarda 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.