GH GambleHub

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.
Uyğun deyil:
  • 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.

Merj qaydaları:
  • 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»).
CRDT seçimi:
  • 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.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.