Eventual consistency — taqsimlangan tizimda yangi yangilanishlar bo‘lmasa, ma’lumotning barcha nusxalari vaqt o‘tishi bilan bir xil qiymatga kelishini kafolatlaydigan consistency modeli. Yozuv muvaffaqiyatli qabul qilingandan keyin ayrim replica yoki consumer vaqtincha eski holatni ko‘rsatishi mumkin. “Eventual” birlashish muddati cheksiz va nazoratsiz bo‘lishi kerak degani emas; tizim lag va convergence maqsadini o‘lchaydi.
Replikatsiya jarayoni
Leader yangilanishni qabul qilib, followerlarga asinxron yuborsa, client darhol acknowledgment olishi mumkin. Shu paytda boshqa regiondagi follower eski qiymatga ega. Replikatsiya xabari yetgach nusxa yangilanadi. Network partition yoki consumer backlog bu oynani uzaytiradi.
Event-driven microservice’da source service event publish qiladi, consumer esa lokal projectionni yangilaydi. Event brokerda kutayotgan paytda read model stale bo‘ladi. At-least-once delivery dublikat berishi mumkin, shuning uchun consumer idempotent ishlaydi.
Anomaliyalar
Client quyidagi holatlarni ko‘rishi mumkin:
- read-after-write buzilishi: o‘zi yozgan qiymatni darhol ko‘rmaydi;
- monotonic read buzilishi: yangi qiymatdan keyin eski qiymat ko‘rinadi;
- write conflict: ikki replica bir obyektni parallel o‘zgartiradi;
- causal order buzilishi: natija uni sabab qilgan hodisadan oldin ko‘rinadi.
Eventual consistency faqat “stale read” emas; conflict resolution va ordering siyosati ham kerak.
Session kafolatlari
Read-your-writes clientning o‘z yozuvini keyingi o‘qishda ko‘rishini ta’minlaydi. Sticky session o‘qishni ayni leader/replicaga yo‘naltirishi yoki version token kerakli pozitsiyaga yetgan replicani kutishi mumkin. Monotonic reads clientni oldingi ko‘rgan versiyadan eski nusxaga tushirmaydi.
Bu kafolatlar global strong consistencydan yengilroq, ammo foydalanuvchi tajribasini yaxshilaydi. Client session uzilganda yoki region almashtirganda tokenning ko‘chishi hisobga olinadi.
Konfliktlarni hal qilish
Last-write-wins timestamp asosida bitta qiymat tanlaydi, lekin clock skew yoki parallel muhim o‘zgarishni yo‘qotishi mumkin. Version vector parallel versiyalarni aniqlaydi. CRDT ayrim ma’lumot turlarida o‘zgarishlarni deterministik birlashtiradi. Business conflict, masalan bir dona mahsulotni ikki marta sotish, faqat texnik merge bilan hal bo‘lmasligi mumkin.
Ownershipni bitta writerga berish konfliktni kamaytiradi. Global yozuvlar region leaderi orqali ketishi latency qo‘shadi, lekin semantikani soddalashtiradi.
Foydalanuvchi interfeysi
Buyurtma yaratilgach qidiruv indeksida kech ko‘rinsa, UI “qayta ishlanmoqda” holatini va operatsiya IDni ko‘rsatishi mumkin. Client bir xil commandni ko‘r-ko‘rona qayta yubormasligi uchun idempotency ishlatiladi. Pending, confirmed va failed holatlari eventual workflow’ni ochiq ifodalaydi.
Monitoring
Replication lag vaqt, log position yoki navbat uzunligi bilan o‘lchanadi. Faqat o‘rtacha lag tail holatlarni yashiradi. Poison message consumer partitionini to‘xtatsa, ayrim keylar umuman converge qilmaydi; dead-letter va alert kerak.
Reconciliation job source of truth bilan projectionni solishtirib, yo‘qolgan eventni tiklaydi. Audit log qaysi versiya qachon qo‘llanganini ko‘rsatadi. Consistency modeli API hujjatida client kutishi mumkin bo‘lgan aniq kafolatlar bilan beriladi.
Quorum modeli
N nusxali store’da write quorum W va read quorum R tanlanishi mumkin. R + W > N bo‘lsa read va oxirgi write kamida bir replica’da kesishadi, lekin concurrent write, sloppy quorum va failure repair sabab semantika baribir implementatsiyaga bog‘liq. Quorumning o‘zi linearizabilityni avtomatik bermaydi.
Anti-entropy
Replica’lar background anti-entropy orqali Merkle tree, version yoki logni solishtirib yo‘qolgan yangilanishni tiklaydi. Read repair o‘qish paytida eski nusxani yangilashi mumkin. Tombstone o‘chirishni replica’lar orasida tarqatadi; u juda erta tozalansa eski replica o‘chirilgan qiymatni qayta tiriltirishi ehtimol.
Cache bilan bog‘liqlik
Database strong bo‘lsa ham cache invalidation kechiksa foydalanuvchi stale qiymat ko‘radi. Cache-aside yozuvdan keyin delete, versioned key yoki qisqa TTL ishlatadi. Database commit va cache delete orasidagi crash oynasi reconciliation yoki event bilan boshqariladi.
Bog‘liq tushunchalar
Replication, Strong consistency, Read-your-writes, Conflict resolution, CRDT, Replication lag