Kotlin Multiplatform'da CRDT'ler: Senkronizasyon Sunucunuzu Devre Dışı Bırakın
Çoğu ekip, veri çakışmalarını yönetmek için merkezi bir sunucu kurar. Sunucu yazma işlemlerini alır, bir kazanan seçer ve en iyisini umar. Bu durum, tek bir hata noktası (single point of failure) ve bakımı zor, karmaşık kodlar oluşturur.
Çakışmasız Çoğaltılmış Veri Tipleri (CRDT'ler) bunu değiştirir. Her cihaz, merkezi bir yöneticiye ihtiyaç duymadan aynı duruma ulaşır. Bu, matematiksel bir garantidir.
Senkronizasyon backend'inizi basit bir blob depolama birimiyle değiştirebilirsiniz. Sunucunuz, veri blob'larını tutan bir aktarıcı (relay) haline gelir. Verilerinizi anlamasına gerek yoktur.
Mobil uygulamalarınız için şu primitifleri kullanın:
• LWW-Register: Kullanıcı profilleri ve ayarlar için kullanın. • G-Counter: Analitikler veya görüntüleme sayıları için kullanın. • PN-Counter: Envanter veya sepet toplamları için kullanın. • OR-Set: Etiketler ve favoriler için kullanın.
Çoğu mobil uygulama için LWW-Register'lar ve OR-Set'ler neredeyse her şeyi kapsar.
Implementation Tip:
Bir LWW-Register oluştururken her zaman bir nodeId ekleyin. Eğer iki güncelleme tamamen aynı zaman damgasına (timestamp) sahipse, nodeId bir eşitlik bozucu (tiebreaker) görevi görür. Bu olmazsa, cihazlarınız aynı duruma senkronize olmayacaktır.
State-based vs. Operation-based:
Mobil için State-based (CvRDT) yöntemini seçin. Birleştirme işlemi idempotent olduğu için güvenilir olmayan ağlarda bile çalışır. Senkronizasyon yarıda kalırsa, sadece tekrar denersiniz.
Başlangıç aşamasında Operation-based (CmRDT) yönteminden kaçının. Bu yöntem "tam olarak bir kez" (exactly-once) teslimat gerektirir. Mobil ağlarda bu altyapıyı kurmak zordur ve kaçınmak istediğiniz karmaşıklığı artırır.
The Architecture:
- CRDT mantığınızı Kotlin Multiplatform projenizin
commonMainmodülünde oluşturun. - Verileri yerel olarak depolamak için SQLDelight kullanın.
- Veri blob'larını S3 veya Cloud Storage gibi bir servise senkronize edin.
- Backend'iniz basit ve ucuz kalır.
Karmaşık senkronizasyon motorları kurmayı bırakın. Mantığı istemciye taşımak için CRDT'leri kullanın. Bu, sunucu rotasyonlarını yönetmek yerine özellik geliştirmeye odaklanmanızı sağlar.
Source: https://dev.to/software_mvp-factory/crdts-in-kotlin-multiplatform-kill-your-sync-server-28n8