Uygulamada Nihai Tutarlılık
Nihai tutarlılık (AT), verilerin kopyalarının geçici olarak ayrışabileceği, ancak sonunda küresel koordinasyon olmadan birleşebileceği bir modeldir. Bu, değişmezlerin, birleştirme kurallarının ve müşteri garantilerinin doğru tanımlanması durumunda yüksek kullanılabilirliğin (AP by CAP) ve düşük gecikmenin (PACELC) anahtarıdır.
1) Ne zaman EC seçilir (ve ne zaman değil)
Sığdır:- Beslemeler, profiller, beğeniler/sayaçlar, dizinler/aramalar, önbelleğe alınmış görünümler.
- Yerel girişler ve yumuşak değişmezlerle küresel sistemler.
- Gerçeğin kaynağının sıkı bir çekirdek olduğu ve okumaların asenkron olduğu projeksiyonlar (CQRS).
- Sabit değişmezler: para, benzersizlik, sınırlar, envanter "eksiye girmez. "Orada - CP/daha güçlü EC, sagas/TSS.
2) EC veri tasarımı: çatışmalar ve bunların çözümü
İlke: Her kayıt, sürüm meta verilerini ve deterministik bir birleştirme işlevini taşır.
Zaman damgaları/sürümler: 'sürüm', 'ts', 'aktör'.
Vektör saati: Nedenselliği düzeltir, "çelişkili paralellikleri" anlamanızı sağlar.
- LWW (Last-Write-Wins): Basit ve hızlı, ancak "anlamını" kaybedebilir.
- CRDT: değişmeli/idempotent yapılar, yakınsamayı garanti eder.
- Etki alanı birleştirme: iş işlevi (örneğin, kopyalar olmadan listeleri birleştirme, toplam sayaçları,'en yeni e-posta + etiket birleştirme ").
- G-Counter/PN-Counter - sayaçları.
- OR-Set kümeleri - ("yapışmadan" silme işlemleri).
- Registers - LWW-Register ("kayıplar" konusunda dikkatli olun).
- Haritalar/belgeler - CRDT'lerin haritası.
- Birlikte yazma - metin CRDT/OT.
3) Replikasyon ve anti-entropi
Dedikodu/anti-entropi: Düğümler arasındaki durumların/hashlerin periyodik değişimi.
İpucu verme: Erişilemeyen bir düğüm için bir girişi geçici olarak "yatırma".
Onarım okuyun: Okurken bir tutarsızlık buldular - en son sürümleri çıkardılar.
Paketleri değiştir (deltalar): Tam çekim değil, deltaları sürüyoruz.
Kuorumlar R/W: Hız ve tazelikten ödün vermek için 'R', 'W', 'N' ayarını yapın (örneğin, 'R + W> N' "son kayıtta" güçlü'ye daha yakındır).
4) EC üzerinden müşteri garantileri
Read-Your-Writes (RYW): Yazar, kaydından sonra görür (yapışkan oturum/sürüm işaretleme).
Monotonik Okumalar: İstemciyi daha eski bir değere "geri almayın" (filigranı en son sürüme tutun).
Nedensel Tutarlılık: Oturum/eylem akışı içinde nedenselliği korur (başlıklar/belirteçlerdeki vektör etiketleri).
Sınırlı Takip: UX açısından kritik ekranlar için "Δ t/N sürümlerinden daha eski değil" garantisi.
5) EC için UX desenleri
İyimser güncellemeler: anında "senkronizasyon" işaretleyerek eylemi yansıtır.
Tazelik işareti: rozet "X saniye önce güncellendi", düğme "Güncelleme".
Çakışma-UI: nadir çarpışmalar için -'her iki sürümü de göster ve seç/birleştir ".
İskelet/yer tutucu + yumuşak yenileme: Global quorum'ları bekleyerek UI'yi engellemeyin.
6) Mimari şablonlar
6. 1 CQRS + projeksiyonları
Yazma çekirdeği (CP): katı değişmezler.
Okuma düzlemi (EC): asenkron projeksiyonlar, indeksler, önbellekler; Lag kabul edilebilir.
6. 2 AP Çok Bölgeli
Yerel olarak hızlı yazın, eşzamansız olarak çoğaltın.
Coğrafi bölümleme: veriler kullanıcıya daha yakın "yaşar"; çapraz bölge - kümeler.
CRDT/birleştirme işlevleri çatışmaların acısını hafifletir.
6. 3 Quorum ayarı
yaml consistency:
replicas: 3 # N write_quorum: 2 # W read_quorum: 2 # R => R + W> N, closer to freshness on "last record"
read_repair: true hinted_handoff: true
7) Sürüm oluşturma ve birleştirme politikaları (örnek)
yaml entity: "profile"
versioning:
clock: "vector" # или "hybrid_time"
fields:
name: { merge: "lww" }
emails: { merge: "set_union" } # OR-Set tags: { merge: "or_set" }
likes: { merge: "pn_counter" }
conflict_ui:
enabled: true show_diff_for: ["name"]
auto_merge_for: ["emails","tags","likes"]
8) EC gözlemlenebilirliği: neyin ölçüleceği
Staleness Age (p50/p95/p99):'şimdi − data_version_ts' veya "lag sürümlerinin sayısı".
Replication Lag: Bölgeler/siteler arasında teslimatı geciktirir.
Çakışma Oranı: paralel güncellemelerin paylaşımı, türlere göre dağılımı.
Okuma-Onarım Hızı/Gecikme: Okurken ne sıklıkta ve ne kadar hızlı "tedavi" ediyoruz.
Yakınsama Süresi: Bir kayıt patlaması/düğüm başarısızlığından sonra yakınsama zamanı.
Anlamsal SLO'lar: "Profillerin %95'i 2'den eski değil", "feed'lerin %99'u <10'lardan yakınsar".
9) Runbook've olaylar
Senaryolar:1. Bölgelerarası lag büyümesi: 'yazma fan-out' azaltmak, agresif okuma-onarım, troll ağır yazarlar içerir.
2. Çatışmalarda dalgalanma: geçici olarak daha "katı'bir kuralı etkinleştirir (örneğin, nedensel/RYW), kısayol tuşlarındaki rekabetçi güncellemeleri sınırlar.
3. Projeksiyon gecikmesi: Çoğaltma kuyruklarına öncelik verin, kritik olmayan güncelleştirmelerin sıklığını geçici olarak kesin.
4. Bazı düğümlerde "sıkışmış" veriler: kuvvet-anti-entropi, parti yeniden dengeleme, teslim denetimi ima etti.
5. Manuel ayrıştırma: çakışan tuşları boşaltma, "birleştirme-önizleme" aracı, savaş düzeltme.
10) EC testi
Jepsen benzeri testler: ağ bölünmeleri, saat eğriltme, yeniden yazma.
Özellik tabanlı: birleştirme fonksiyonlarının değişmezleri (commutativity, idempotency, associativity).
Fuzz çakışmaları: Değişken teslimat siparişi olan bir anahtar için paralel güncellemeler.
Yük "testereler": yakınsama süresini değerlendirmek için alternatif patlamalar/lulls.
UX simülasyonları: Tipik senaryolarda RYW/monotonik görünürlük.
11) Çok kiracı ve planlar
Etiketler 'tenant _ id/plan/region' olaylar/kayıtlarda.
Adalet: Kiracı başına replikasyon/onarım, "gürültülü" istemcinin genel sapkınlığı artırmamasını sağlar.
İkamet: veriler ve yargı alanındaki kopyaları; Bölgeler arası görünümler yalnızca toplanır.
12) Tipik hatalar
LWW'her şey için. "Anlamsal paralel değişiklikleri kaybeder; CRDT/domain birleştirme kullanın.
Müşteri garantisi yoktur. Kullanıcı kendi kaydını "görmüyor" - güven kaybı.
Eskimenin gözlemlenebilirliği yoktur. Staleness/lag - "gizli bozulma" metrikleri yoktur.
Birleştirmeden farklı sistemlere çift yazma. Fantomlar ve ayrışmalar sonsuzdur.
Ne pahasına olursa olsun küresel düzen. Ekstra kuorumlar p95'i öldürür ve işletmeler için yerel düzen yeterlidir.
13) Hızlı tarifler
Besleme/bant: Yazar için EC + nedensel/RYW, reaksiyonlar için CRDT, staleness p95 ≤ 2-5c.
Profiller/ayarlar: sınırlı sapma (≤1 -2c), RYW, etki alanı birleştirme (birlik kümeleri).
Küresel katalog: coğrafi bölme, asenkron çoğaltma, talep üzerine okuma-onarım, OR-Set üzerinden çakışmalar.
Metrikler/sayaçlar: PN-Counter, arka planda konsolidasyon; Bir etiketle "yaklaşık" değerleri görüntüler.
14) Mini standart (sözlü şema)
Write-edge: sürüm ile yerel kayıt ('vektör/karma'), olay günlüğü.
Replikasyon: очереди + dedikodu/anti-entropi, ima edilen devir.
Depolama: Anahtarla bölümleme, yazma düzeyinde CRDT/birleştirme işlevleri.
Okuma-düzlem: okuma-onarım, RYW/monotonik belirteçler, kritik ekranlar için sınırlı staleness ile önbellekler.
Gözlemlenebilirlik: Gecikmeler/eskime/çatışmalar, SLO gizliliğini aşan uyarılar.
15) Satış öncesi kontrol listesi
- Değişmezler ve EC'ye izin verilen yerler açıkça tanımlanmıştır.
- Vektör/melez ve birleştirme/CRDT deterministik fonksiyonları seçilir.
- Kritik UX'ler için uygulanan müşteri garantileri (RYW/monotonik/nedensel).
- Çoğaltma, okuma-onarım, ima handoff yapılandırılmış; R/W kuorum belgelenmiştir.
- staleness/lag/convergence metrikleri ve p95/p99 eşik uyarıları.
- Runbook've çatışmaların/gecikmelerin büyümesi üzerine; Güvenli el birleştirme aletleri.
- Ağ bölümleri, paralel güncellemeler ve yakınsama özelliği için testler.
- Çok kiracılı limitler ve ikamet politikaları dikkate alınır.
- UX tazelik göstergeleri ve geri dönüş davranışı ürünle tutarlıdır.
Sonuç
Nihai tutarlılık bir "uzlaşma için uzlaşma'değil, bir ölçeklenebilirlik ve kullanılabilirlik aracıdır. Değişmezleri resmileştirirseniz, doğru birleştirme işlevlerini seçin (tercihen uygun olduğunda CRDT), müşteri garantileri verin ve staleness ve yakınsama süresini ölçün, sistem hem kullanıcılar hem de işletmeler için hızlı, istikrarlı ve dürüst olacaktır.