Mimari
Firebase Firestore
push ▲ ▼ onSnapshot
┌────────────┴─────────┴────────────┐
│ Redux durumu │
│ (AsyncStorage'a gecikmeli kayıt) │
└───────┬───────────────────┬───────┘
kullanıcı işlemi başka cihazdan değişiklik
durum: pending durum: synced / conflict
- Gönderim: Her değişiklik önce yerel duruma ve bir outbox kuyruğuna yazılıyor; arayüz beklemeden güncelleniyor. Kuyruk sırayla Firestore’a gönderiliyor. Ağ hatasında kalan kayıtlar bir sonraki senkrona kalıyor; uygulama arada kapansa bile kaybolmuyor.
- Alım: Firestore
onSnapshotile dinleniyor. Bu olmadan cihazlar birbirinin verisini hiç göremezdi.
Çakışma
Her kaydın bir version alanı var. Gönderim bir Firestore transaction’ı içinde yapılıyor: cihazın bildiği sürüm sunucudakiyle uyuşmuyorsa, kayıt arada başka bir cihazda değişmiş demektir ve yazma reddedilip conflict dönüyor. Kullanıcıya iki sürüm yan yana gösteriliyor ve üç seçenek sunuluyor: yerel sürümü tut, sunucu sürümünü kabul et ya da birleştir.
Denemek için
Uygulamada çevrimdışı modu açıp kayıt eklediğinizde kayıt “bekliyor” durumunda kalıyor, tekrar çevrimiçi olunca kendiliğinden gönderiliyor. “Uzaktan değişikliği simüle et” düğmesi başka bir cihazın aynı kaydı değiştirdiğini taklit ediyor ve bir sonraki senkronda gerçek bir çakışma üretiyor. Aynı anda telefonda ve web’de açınca birinde eklenen kayıt birkaç saniye içinde diğerinde görünüyor.
Reducer’lar ve senkron motoru Jest ile, çakışma senaryosu dahil test ediliyor.