Təcrübədə Eventual Consistency
Eventual consistency (EC) - məlumatların nüsxələrinin müvəqqəti olaraq ayrıla biləcəyi, lakin zaman keçdikcə qlobal koordinasiya olmadan birləşdiyi model. Bu, invariantları, merj qaydalarını və müştəri zəmanətlərini düzgün müəyyən edərsə, yüksək mövcudluğun (CAP AP) və aşağı gecikmənin (PACELC) açarıdır.
1) Nə zaman EC seçmək (və nə zaman - yox)
Uyğun:- Fid, profil, bəyənmə/sayğaclar, kataloqlar/axtarış, cached performans.
- Yerli qeydlər və yumşaq invariantlarla qlobal sistemlər.
- Həqiqətin mənbəyi sərt nüvədir və oxu asenkrondur.
- Sərt invariantlar: pul, tək, limitlər, inventar «mənfi getmək deyil». Orada - SR/daha güclü EC, saqa/TSS.
2) EC altında data dizaynı: münaqişələr və onların həlli
Prinsip: Hər bir yazı versiya meta-məlumatlarını və müəyyən edilmiş birləşmə funksiyasını daşıyır.
Vaxt işarələri/version: 'version', 'ts', 'actor'.
Vektor saatı: səbəbləri düzəldir, «ziddiyyətli paralelləri» anlamağa imkan verir.
- LWW (Last-Write-Wins): sadə və sürətli, lakin «mənasını» itirə bilər.
- CRDT: kommutativ/idempotent strukturları, uyğunlaşma təmin edir.
- Domain merge: biznes funksiyası (məsələn, dubl olmadan siyahıları birləşdirmək, sayğacları ümumiləşdirmək, «ən yeni email + etiketlərin birləşməsi»).
- Sayğaclar → G-Counter/PN-Counter.
- Çoxluq → OR-Set («yapışma» olmadan çıxarılması).
- Qeydlər → LWW-Register («itki» ehtiyatla).
- Kart/sənədlər → Map of CRDTs.
- Birgə redaktə → mətn CRDT/OT.
3) Replikasiya və anti-entropiya
Gossip/anti-entropy: düyünlər arasında dövri vəziyyət/hash mübadiləsi.
Hinted handoff: əlçatmaz qovşaq üçün müvəqqəti «depozit» qeyd.
Read repair: Oxu zamanı bir uyğunsuzluq aşkar etdi - yeni versiyaları gücləndirdi.
Dəyişiklik paketləri (deltas): tam şəkilləri deyil, deltaları təqib edirik.
R/W kvorumları: 'R', 'W', 'N' sürət və təravət güzəştinə uyğunlaşdırırıq (məsələn, 'R + W> N' son yazıda strong-a daha yaxındır).
4) EC üzərindən müştəri zəmanətləri
Read-Your-Writes (RYW): Müəllif yazısından sonra onu görür (sticky-session/marking versiyası).
Monotonic Reads: Müştərini köhnə qiymətə «yuvarlamayın» (ən son versiya watermark saxlayın).
Causal Consistency: sessiya/hərəkət axını (başlıqlarda/tokenlərdə vektor işarələri) daxilində səbəbləri saxlayın.
Bounded Staleness: UX kritik ekranlar üçün «Δ t/N versiyası» zəmanət.
5) EC üçün UX nümunələri
Optimist yeniləmələr: «sinxronizasiya» işarəsi ilə hərəkəti dərhal əks etdiririk.
Təravət nişanı: «yenilənmiş X saniyə geri» nişanı, «Yeniləmə» düyməsi.
Münaqişə-UI: Nadir toqquşmalar üçün - «hər iki versiyanı göstərmək və seçmək/birləşdirmək».
Skelet/placeholder + soft refresh: qlobal kvorum gözləyərək UI bloklamaq deyil.
6) Memarlıq şablonları
6. 1 CQRS + proyeksiyaları
Write-nüvəsi (CP): ciddi invariantlar.
Read-plane (EC): Asinxron proyeksiyalar, indekslər, caches; laq.
6. 2 Multi-region AP
Qeydlər yerli olaraq sürətli, replikasiya asinxronikdir.
Geo-partitioning: məlumatlar istifadəçiyə daha yaxın «yaşayır»; kross-region - aqreqatlar.
CRDT/merge funksiyaları münaqişə ağrılarını aradan qaldırır.
6. 3 Kvorum konfiqurasiya
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) Version və merge siyasəti (nümunə)
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 müşahidə: ölçmək üçün nə
Staleness Age (p50/p95/p99): 'now − data_version_ts' və ya «gecikmə versiyalarının sayı».
Replication Lag: Bölgələr/qovşaqlar arasında çatdırılma gecikməsi.
Conflict Rate: paralel yeniləmələrin payı, növlərə görə paylanması.
Read-Repair Rate/Latency: oxu zamanı tez-tez və tez-tez «müalicə».
Convergence Time: Engineering up/düyün uğursuzluğu sonra vaxt.
Semantik SLO: «Profillərin 95% -i 2s-dən yuxarı deyil», «99% feed <10s».
9) Runbook və hadisələr
Ssenarilər:1. Böyümə lag regionlararası: aşağı 'write fan-out', aqressiv read-repair daxil, ağır yazıçılar Trottle.
2. Münaqişələrin artması: müvəqqəti olaraq daha «sərt» qaydanı (məsələn, causal/RYW) işə salmaq, isti açarlarda rəqabət yeniləmələrini məhdudlaşdırmaq.
3. Proyeksiyaların gecikməsi: replikasiya növbələrini prioritet etmək, kritik olmayan yeniləmələrin tezliyini müvəqqəti olaraq azaltmaq.
4. Düyünlərin bir hissəsində məlumatlar «yapışıb»: fors-anti-entropiya, partiyaların rebalansı, hinted handoff auditi.
5. Əl təhlili: konflikt açarlarının boşaldılması, «merge-preview» aləti, batch fix.
10) EC test
Jepsen oxşar testlər: şəbəkə bölünmələri, clock-skew, təkrar qeydlər.
Property-based: merge funksiyalarının invariantları (kommutativlik, idempotentlik, assosiativlik).
Fuzz konfliktləri: müxtəlif çatdırılma qaydası ilə paralel bir açar yeniləmələri.
Yük «mişar»: convergence time qiymətləndirmək üçün burst/sakitlik növbə.
UX simulyasiyası: tipik ssenarilərdə RYW/monotonic görünürlük.
11) Multi-tenant və planlar
Tags 'tenant _ id/plan/region' hadisə/qeydlərdə.
Fairness: «səs-küylü» müştərinin ümumi staleness artırmaması üçün replikasiya/repair per tenant limitləri.
Residency: yurisdiksiya daxilində məlumatlar və onların replikaları; cross-regional görünüşü yalnız aqreqatları.
12) Tipik səhvlər
LWW «hər şey üçün». Semantik paralel dəyişiklikləri itirir; CRDT/domain merge istifadə edin.
Heç bir müştəri zəmanəti yoxdur. İstifadəçi öz yazısını «görmür» → etimad itkisi.
Köhnəlmə müşahidə edilməməsi. No metrik staleness/lag → «gizli deqradasiya».
merge olmadan müxtəlif sistemlərdə Dual-write. Fantomlar və fərqlər sonsuzdur.
Qlobal nizam nəyin bahasına olursa olsun. Əlavə kvorumlar p95-i öldürür və biznes üçün kifayət qədər yerli nizam var.
13) Sürətli reseptlər
Fid/Tape: EC + causal/RYW müəllif üçün, CRDT reaksiyalar üçün, staleness p95 ≤ 2-5s.
Profillər/parametrlər: bounded staleness (≤ 1-2s), RYW, domen merge (çoxluqlar birliyi).
Qlobal kataloq: geo-partition, asenxron replikasiya, istək üzrə read-repair, OR-Set vasitəsilə münaqişələr.
Metrik/sayğaclar: PN-Counter, fonda konsolidasiya; işarə ilə «təxmini» dəyərləri göstərmək.
14) Mini etalon (şifahi sxem)
Write-edge: versiyası ilə yerli qeyd ('vector/hybrid'), hadisə jurnalı.
Replication: очереди + gossip/anti-entropy, hinted handoff.
Storage: açar, CRDT/yazı səviyyəsində merc funksiyaları ilə partizan.
Read-plane: kritik ekranlar üçün read-repair, RYW/monotonik tokenlər, bounded staleness ilə caches.
Observability: lag/köhnəlmə/konfliktlər, SLO stylness həddindən artıq alert.
15) Satış öncəsi yoxlama siyahısı
- İnvariantlar və harada EC icazə verilir.
- Seçilmiş version (vector/hybrid) və determinated funksiyaları merge/CRDT.
- Kritik UX üçün müştəri zəmanəti (RYW/monotonic/causal).
- Xüsusi replication, read-repair, hinted handoff; R/W kvorumları sənədləşdirilmişdir.
- staleness/lag/convergence metrikləri və p95/p99 astanalarına görə alertlər.
- Runbook 'və artan münaqişələr/lag; təhlükəsiz əl merge alətləri.
- Şəbəkə bölünmələri, paralel yeniləmələr və oxşarlıq xüsusiyyətləri üçün testlər.
- Multi-tenant limitləri və residency siyasətləri nəzərə alınır.
- UX təzəlik və fallback davranış göstəriciləri məhsul ilə razılaşdırılır.
Nəticə
Eventual consistency - «kompromis üçün kompromis» deyil, miqyaslı və əlçatan vasitədir. Əgər siz invariantları rəsmiləşdirirsinizsə, düzgün ölçü funksiyalarını seçirsinizsə (tercihen uyğun olduğu yerdə CRDT), müştəri zəmanətləri verirsinizsə və stylness və eniş vaxtını ölçəcəksinizsə, sistem sürətli, davamlı və dürüst olacaq - həm istifadəçilər, həm də biznes üçün.