Bu ölçekte CRDT tabanlı bir işbirlikçi sistem tasarlamak için, operasyonların sıralanması için bir merkezi otorite gerektiren geleneksel Operasyon Dönüşümü (OT) modellerini terk etmelisiniz. Bu eski yaklaşımlar, çatışma çözümü için bir koordine sunucusuna sürekli bağlantı gerektirdiklerinden, gerçek çevrimdışı öncelikli yeteneklerin önüne geçmektedir. Bunun yerine, koordine veya uzlaşma protokolleri olmadan yakınsama garantisi sağlamak için birlikte toplama, birleştirme ve idempotans gibi matematiksel özellikleri kullanarak Durum Tabanlı CRDT'ler (özellikle RGA - Çoğaltılan Büyüyen Dizi) uygulayın.
Sadece yerel durumları arasındaki farklılıkları tam durum görüntüleri yerine değiş tokuş eden Delta-State Anti-Entropy protokollerini dağıtın. Bu yaklaşım, naif durum tabanlı çoğaltmaya kıyasla senkronizasyon sırasında bant genişliği tüketimini kat kat azaltır. **Fiziksel zaman damgalarını mantıksal sayaçlarla birleştiren Hibrid Mantıksal Saatler (HLC) kullanmalısınız; böylece, sıkı NTP bağımlılığı olmadan bölgeler arasında nedensellik sağlanır ve saat kayması yönetilir. Son olarak, silme belirteçleri ile sınırlandırılmış bellek büyümesini önlemek için çağrışım izini koruyarak Tombstone Çöp Temizliği uygulayın.
Ekibimiz, 50.000 kurumsal takımın farklı zaman dilimlerinde desteklediği, Figma benzeri bir tasarım aracının gerçek zamanlı işbirliği motorunu yeniden inşa etme görevini üstlendi. Eski sistem, 10.000+ kullanıcının uçuşlar sırasında çevrimdışı düzenlemeler yapmaya çalıştığında çökmesine neden olan merkezi bir Node.js sunucusu aracılığıyla Redis pub/sub ve WebSocket bağlantılarını kullanıyordu. Bu artış, geri dönüşsüz durum ayrışmasına ve kalıcı belge bozulmasına yol açtı ve bu da 48 saatlik bir kesinti ve önemli müşteri kaybı ile sonuçlandı.
Öncelikle çevrimdışı düzenleme için kullanıcıların belge bölümleri üzerinde özel kilitler alması gereken Merkezi OT ile Kiralama Kilitleri yöntemini değerlendirdik. Bu çözüm, geleneksel veritabanlarıyla benzer güçlü tutarlılık ve tanıdık ACID semantiklerini vaat ediyordu. Ancak, kilit yenilemesi için sürekli bağlantı gereksinimi, çevrimdışı öncelikli koşulunu tamamen ihlal etti ve ağ bölünmeleri sırasında tüm ürünü kullanılmaz hale getirebilecek felaket bir tek nokta arızası yarattı.
İkinci aday çözüm, çelişkileri belirleyici bir şekilde çözmek için AWS DynamoDB zaman damgalarını kullanan Son-Yazan-Kazandı (LWW) ile Vektör Saatleri önerdi. Bu yaklaşım gerçek çevrimdışı düzenlemeyi desteklese de, mevcut bulut altyapısıyla uygulanması kolaydı, ancak eşzamanlı düzenlemeler sırasında felaket bir veri kaybına uğradı. İki tasarımcı çevrimdışı aynı bileşeni taşırken, yalnızca son senkronizasyonun zaman damgası hayatta kalacak, böylece bir kullanıcının çalışması uyarı yapılmadan tamamen silinmiş olacaktı.
Sonunda, merkezi koordine gereksinimini ortadan kaldıran, ağ bölümlemesi süresinden bağımsız yakınsama garantisi sağlayan ve internet bağlantısı olmadan aynı LAN üzerindeki kullanıcılar arasında P2P senkronizasyonunu destekleyen Yjs kütüphanesini kullanan Durum Tabanlı CRDT'leri seçtik. Senkronizasyon yüklerini, tam durum transferine kıyasla %94 oranında azaltan Merkle-ağaç delta kodlaması uyguladık ve belge geçmişinin kriptografik bütünlüğünü koruduk.
Altı aylık üretim trafiğinden sonra, sistem, kullanıcıların çevrimdışı düzenlemeye devam ettiği ve sıfır veri kaybı ile yeniden bağlandıklarında sorunsuz bir şekilde birleştikleri, tüm bir bölgeyi etkileyen 72 saatlik bir Cloudflare kesintisini başarıyla yönetti. Belge yükleme süreleri, çatışma çözümü için sunucu gidiş-gelişlerinin ortadan kaldırılması sayesinde 4.2 saniyeden 180 milisaniyeye düştü. Altyapı maliyetleri, koordine aşınmasının kaldırılması ve güçlü merkezi bilgi işlem örnekleri yerine kenar önbellekleme kullanma yeteneği sayesinde %60 oranında düştü.
Kullanıcılar içeriği sildiğinde, CRDT'ler nasıl sınırsız tombstone büyümesini yönetir ve güvenli kaldırılmalarını ne tetikler?
Çoğu aday silme işlemlerinin bellekten hemen temizlenebileceğini varsayıyor, ancak CRDT'ler, silinen verilerin, geri kalmış birkaç kopya ile birleştirilmesi sırasında yeniden doğmasını önlemek adına gerekliyken, çağrışım izini takip etmek için tombstone’lar gerektirir. Çözüm, vektör saat karşılaştırması kullanarak Nedensellik Dengelemesi tespiti uygular; bir düğüm, diğer tüm kopyaların belirli bir zaman damgasına kadar bir silmeyi kabul ettiğini gözlemlediğinde, tombstone kararlı hale gelir ve kaldırılmaya uygun hale gelir. Dönem Tabanlı Çöp Temizliği uygulanmalı; burada tombstone’lar yapılandırılabilir bir dayanıklılık süresi sonunda kaldırmak için işaretlenir ve yalnızca nedensellik kesintisi, geri kalmış bir kopyanın yakınsama için onlara ihtiyaç duymadığı kanıtlandığında fiziksel olarak silinir. Bu mekanizma olmadan, altı ay önceki bir çevrimdışı cihaz, bağlantı sağlandığında eski silinmiş verileri yeniden oluşturabilir ve kullanıcıların kalıcı silme ve gizlilik uyumluluğu beklentilerini ihlal edebilir.
Ağ gereksinimleri açısından durum tabanlı ve operasyon tabanlı CRDT'ler arasındaki temel fark nedir ve dar bant mobil bir ortamda niçin birini diğerine tercih edersiniz?
Op-tabandaki CRDT'ler, taşınan katmanından eksiksiz bir önceki iletileri ve neden kaynaklıklı iletim garantileri gerektirir, bu nedenle kayıplı veya uyarı olmadan çoğaltılan mesajlar. Durum-tabandaki CRDT'ler, mesaj çoğaltmasına ve keyfi gecikmelere tolerans gösterir; ancak genellikle tüm belge durumunu iletmek zorunda olduğundan, hücresel ağlarda büyük tasarım dosyaları için çok maliyetli olmuştur. Gelişmiş çözüm, yalnızca son başarılı senkronizasyondan beri olan değişiklikleri ileten Delta-state CRDT'leri kullanır; bu, durum tabanlı ağ sağlamlığını op-tabandaki verimlilikle birleştirir. Mobil ortamlarda, Geri Çekilme Delta Senkronizasyonu ve Bloom Filtreleri uygulamalısınız; böylece zaten görülen güncellemeleri yeniden iletmekten kaçınır ve tam durum senkronizasyonuna kıyasla mobil veri kullanımını %99 oranında azaltırken çevrimdışı öncelikli özellikleri korursunuz.
İki kullanıcının metni aynı imleç konumuna eşzamanlı olarak eklerken, 'ördekleme anomalisi'ni nasıl önlersiniz ve düzenlemelerinin birbirine bitişik bloklar olarak görünmesini sağlarsınız, rasgele iç içe geçmiş karakterler olarak değil?
Standart LWW veya basit sayaç tabanlı CRDT'ler, helo sorunu yaratır; aynı konumda hi ve bye kelimelerinin eşzamanlı eklenmesi hbyeio gibi anlamsız hale gelir. Çözüm, her karakter için, düğüm kimliği ve mantıksal zaman damgasına dayalı global benzersiz tanımlayıcılar (GUID) atayan Çoğaltılmış Büyüyen Dizi (RGA) veya Woot algoritmalarını gerektirir; belirleyici düzenleme kuralları, toplam bir sıralama oluşturur. Ekleme sırasında, yeni öğeyi sayısal bir indeks yerine belirli bir öncekine ekleyerek, birbirine bağlı bir liste yapısının oluşmasını sağlar; burada eşzamanlı eklemeler, iç içe geçmeden belirgin bir şekilde belirlenerek bir araya gelir. Ayrıca, belge boyutunun tamamında %20'den az meta veri aşırılığı sağlarken, eşzamanlı düzenlemelerin niyetini koruyan sezgisel bir birleştirme mantığını sürdürmek için Koşma Uzunluğu Kodlama optimizasyonlarını uygulamalısınız.