Uygulamayı olarak ele alın: her cihaz yerel bir 'dır. Çalışma eylemleri bir ile birlikte yalnızca ekleme yapılan bir 'a (outbox) yazılır; yeniden bağlanınca cihaz ve son senkronizasyonundan bu yana . Çakışmalar tek bir global kuralla , ile çözülür.
Uygulamayı olarak ele alın: her cihaz yerel bir 'dır. Çalışma eylemleri bir ile birlikte yalnızca ekleme yapılan bir 'a (outbox) yazılır; yeniden bağlanınca cihaz ve son senkronizasyonundan bu yana . Çakışmalar tek bir global kuralla , ile çözülür.
Zihinsel model: bunu git gibi düşünün — her cihaz çevrimdışıyken yerel olarak "commit" yapar ve senkronizasyon bir üzerine yazma değil, bir merge'dir.
Device (offline) Server = source of truth
┌──────────────────┐ on reconnect ┌───────────────────────────┐
│ Local DB (SQLite)│ push ops (delta) │ Sync API /sync │
│ + Op log (outbox)│ ─────────────────▶ │ • idempotent by op.id │
│ cursor = lastSeen│ ◀───────────────── │ • merge by semantics │
└──────────────────┘ pull changes>cursor└───────────────────────────┘
Progress DB (Postgres)
Telefon saatleri güvenilmezdir ve iki cihaz aynı kaydı çevrimdışı düzenleyebilir, bu yüzden "last write wins" (LWW) sessizce veri kaybeder. Semantiğe göre çözün:
// op'un bir id'si var -> idempotent uygula (yeniden denemeler iki kez saymaz). clientTs GÜVENİLMEZ.
function mergeProgress(server, op) {
return {
// progress yalnızca artar -> max: geç kalan eski bir op onu asla geriye çekmez
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs toplamsal bir sayaçtır -> delta'yı ekle, üzerine yazma
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Burada, düz LWW geç senkronize olan bayat bir cihazın progress: 0.3 değeriyle sunucunun 0.9 değerinin üzerine yazmasına izin verir → kaybedilmiş ilerleme. max almak ve studiedMs'i toplamak senkronizasyonu sıra bağımsız yapar — milyonlarca cihaz kaymış saatlerle senkronize olurken güvenlidir.
Mülakatı yapan kişi, istemci saatlerinin güvenilemeyeceğini (yani saf timestamp LWW değil) bilip bilmediğinizi, senkronizasyonu idempotent yapıp yapmadığınızı (op id'leri) ve veri anlamına göre merge edip etmediğinizi araştırıyor. Zayıf bir cevap: "timestamp kullan, last write wins." Güçlü bir cevap: replica + op log + idempotency + alan bazlı merge + source of truth olarak sunucu — ve LWW'nin veri kaybı başarısızlığını açıkça adlandırmak.
LWW ucuzdur ama kayıplıdır; semantik merge alan bazlı düşünme gerektirir ama hiçbir şey kaybetmez. Tam CRDT/OT'ye yalnızca gerçek işbirlikçi düzenlemeye (notlar, dökümanlar) ihtiyaç duyduğunuzda başvurun — maliyetlidir, bu yüzden her şey için kullanmayın.
Junior'dan Senior'a detaylı cevaplarla bir BT mülakat soruları kütüphanesi.
Bağış Yap