GH GambleHub

Taqsimlangan qulflar

1) Nima uchun (va qachon) taqsimlangan blokirovkalar kerak

Taqsimlangan blokirovka - klastyerning bir necha uzellari orasidagi tanqidiy seksiya uchun o’zaro istisno qilinishini kafolatlovchi mexanizm. Namunaviy vazifalar:
  • Orqa fon vazifasi uchun yetakchilik (leader election).
  • Yagona ijrochini umumiy resurs ustidan cheklash (fayllarni ko’chirish, sxema migratsiyasi, eksklyuziv to’lov qadami).
  • Agregatni (wallet/order) ketma-ket qayta ishlash, agar boshqacha idempotentlikka/tartibga solishga erishib boʻlmasa.
Qulfni qachon ishlatmaslik kerak:
  • Agar idempotent upsert, CAS (compare-and-set) yoki kalit navbati (per-key ordering) qilish mumkin boʻlsa.
  • Agar manba kommutativ operatsiyalarga ruxsat bersa (CRDT, hisoblagichlar).
  • Agar muammo bitta ombordagi tranzaksiya orqali hal qilinsa.

2) Tahdidlar modeli va xossalari

Nosozliklar va murakkabliklar:
  • Tarmoq: kechikishlar, ajratish (partition), paketlarni yoʻqotish.
  • Jarayonlar: GC pauza, stop-the-world, qulf olingandan so’ng.
  • Vaqt: soat drifti va siljish TTL yondashuvlarini buzadi.
  • Qayta egalik qilish: «zombi» protsessi tarmoqdan keyin qulfga ega deb o’ylashi mumkin.
Kerakli xususiyatlar:
  • Xavfsizlik: bittadan ortiq haqiqiy egasi (safety).
  • Omon qolish: qulf egasi ishlamay qolganda (liveness) bo’shatiladi.
  • Adolat: ochlik yoʻq.
  • Soatdan mustaqillik: toʻgʻrilik wall-clock ga bogʻliq emas (yoki fencing tokens bilan qoplanadi).

3) Asosiy modellar

3. 1 Lease (ijara qal’asi)

Qulf TTL bilan beriladi. Egasi uni muddati tugagunga qadar uzaytirishi shart (heartbeat/keepalive).

Afzalliklari: kreshda o’zini o’zi ta’minlash.
Xavf-xatarlar: agar egasi «osilib» qolsa va ishlashda davom etsa, lekin uzaytirishni yo’qotsa, ikki tomonlama egalik qilish paydo bo’lishi mumkin.

3. 2 Fencing token (to’siq tokeni)

Har bir muvaffaqiyatli qo’lga olishda monoton o’suvchi raqam beriladi. Resurs iste’molchilari (DB, navbat, fayl ombori) tokenni tekshiradilar va eski raqam bilan operatsiyalarni rad etadilar.
Bu TTL/lease va tarmoq bo’linmalarida juda muhimdir - «eski» egasidan himoya qiladi.

3. 3 Quorum-qulflar (CP-tizimlar)

Taqsimlangan konsensusdan foydalaning (Raft/Paxos; etcd/ZooKeeper/Consul), yozuv konsensus logi bilan bog’liq → ko’pgina tugunlarda split breyn yo’q.

Plyus: kuchli xavfsizlik kafolatlari.
Minus: kvorumga sezgirlik (uni yo’qotganda omon qolish).

3. 4 AP qulflar (in-memory/kesh + replikatsiya)

Masalan, Redis klasteri. Yuqori foydalanish imkoniyati va tezligi, lekin tarmoq bo’linishlarida xavfsizlikning qat’iy kafolatlarisiz. Ko’k tomonda fencing talab qilinadi.

4) Platformalar va patternlar

4. 1 etcd/ZooKeeper/Consul (strong locks uchun tavsiya etiladi)

Efemer tugunlari (ZK) yoki/leases (etcd): kalit hozircha mavjud.
Sessiya keepalive; kvorumni yo’qotish → sessiya tugaydi → qulf bo’shatiladi.
Navbat kutish uchun tartib uzellari (ZK’EPHEMERAL _ SEQUENTIAL’) → adolat.

Etcd (Go) dagi eskiz:
go cli, _:= clientv3. New(...)
lease, _:= cli. Grant(ctx, 10)            // 10s lease sess, _:= concurrency. NewSession(cli, concurrency. WithLease(lease. ID))
m:= concurrency. NewMutex(sess, "/locks/orders/42")
if err:= m. Lock(ctx); err!= nil { / handle / }
defer m. Unlock(ctx)

4. 2 Redis (ehtiyotkorlik bilan)

Klassika -’SET key value NX PX ttl’.

Muammolar:
  • Replikatsiya/faylover bir vaqtning oʻzida egalariga ruxsat berishi mumkin.
  • Bir nechta instansiyalardan Redlock xavfni kamaytiradi, lekin bartaraf etmaydi; ishonchsiz tarmoqli muhitlarda bahsli.

Redisni tezkor muvofiqlashtiruvchi qatlam sifatida ishlatish xavfsiz, ammo maqsadli manbada har doim fencing tokenini toʻldirish mumkin.

Misol (Lua-unlock):
lua
-- release only if value matches if redis. call("GET", KEYS[1]) == ARGV[1] then return redis. call("DEL", KEYS[1])
else return 0 end

4. 3 DB-qulflar

PostgreSQL advisory locks: Postgres klasteridagi lok (jarayon/sessiya).
Barcha tanqidiy bo’limlar bitta DBda bo’lsa yaxshi bo’ladi.

SQL:
sql
SELECT pg_try_advisory_lock(42); -- take
SELECT pg_advisory_unlock(42); -- let go

4. 4 Fayl/bulut qulflari

S3/GCS +’If-Match’(ETag) shartlari bo’lgan ob’ektli meta ma’lumotlar lok → mohiyatan CAS.
Bekap/migratsiya uchun mos keladi.

5) Xavfsiz qulf dizayni

5. 1 Egasining aynan

’owner _ id’ (tugun #процесс #pid #start_time) + tasodifiy tokenni unlockda solishtirish uchun saqlang.
Unlock boshqa birovning qulfini olib tashlamasligi kerak.

5. 2 TTL va uzaytirish

TTL <T_fail_detect (nosozlikni aniqlash vaqti) va kritik seksiya ishining ≥ p99 × zaxirasi.
Uzaytirish - davriy (masalan, har bir’TTL/3’), deadline bilan.

5. 3 Fencing token

Tashqi resursni oʻzgartiruvchi seksiya’fencing _ token’ni uzatishi kerak.

Sink’last _ token’ni saqlaydi va kichiklarini rad etadi:
sql
UPDATE wallet
SET balance = balance +:delta, last_token =:token
WHERE id =:id AND:token > last_token;

5. 4 Kutish navbati va adolat

ZK -’EPHEMERAL _ SEQUENTIAL’va kuzatuvchilar: mijoz eng yaqin oʻtmishdoshini ozod qilishni kutmoqda.
V etcd - taftish/versiya qilingan kalitlar; «mod _ revision» bo’yicha navbat.

5. 5 Split-brain xatti-harakati

CP yondashuvi: kvorumsiz qulf olish mumkin emas - safety buzishdan ko’ra turish yaxshiroqdir.
AP-yondashuv: ajratilgan orollarda taraqqiyot mumkin → fencing kerak.

6) Yetakchilik (leader election)

etcd/ZK - «lider» eksklyuziv epemer kaliti; qolganlari o’zgartirish uchun imzolangan.
Rahbar heartbeats yozadi; yo’qotish - qayta saylanish.
Rahbarning barcha operatsiyalarini fencing token (davr/taftish raqami) bilan kuzatib boring.

7) Xatolar va ularni qayta ishlash

Mijoz qulfni oldi, lekin ishlashdan oldin krash → normalar, hech kim zarar ko’rmaydi; TTL/sessiya bo’shatiladi.

Qulf ish oʻrtasida tugadi:
  • Majburiy watchdog: agar uzaytirish muvaffaqiyatsiz boʻlsa - tanqidiy seksiyani toʻxtatib, orqaga qaytish/kompensatsiya qilish.
  • Hech qanday «keyin tugatish»: qulfsiz tanqidiy qismni davom ettirish mumkin emas.

Uzoq pauza (GC/stop-the-world) → uzaytirish amalga oshmadi, ikkinchisi qulfni oldi. Ish jarayoni egalik yoʻqolishini (keepalive) aniqlab, uni toʻxtatishi kerak.

8) Dedloklar, ustuvorliklar va inversiya

Taqsimlangan dunyoda dedloklar kamdan-kam uchraydi (odatda bitta qulf), lekin agar bir nechta qulflar bo’lsa, lock ordering tartibiga rioya qiling.
Ustuvorlik inversiyasi: past prioritetli egasi resursni yuqori prioritetlilar kutayotganda ushlab turadi. Yechimlar: TTL-limitlar, preemption (agar biznes ruxsat bersa), sharding resurs.
Ochlik: adolat uchun kutish navbatlaridan (ZK-tartib tugunlari) foydalaning.

9) Kuzatish

Metriklar:
  • `lock_acquire_total{status=ok|timeout|error}`
  • `lock_hold_seconds{p50,p95,p99}`
  • ’fencing _ token _ value’ (monotonlik)
  • `lease_renew_fail_total`
  • ’split _ brain _ prevented _ total’ (kvorum yoʻqligi sababli qancha urinishlar rad etildi)
  • `preemptions_total`, `wait_queue_len`
Logi/treysing:
  • `lock_name`, `owner_id`, `token`, `ttl`, `attempt`, `wait_time_ms`, `path` (для ZK), `mod_revision` (etcd).
  • «acquire → critical section → release» spanlari natija bilan.
Alertlar:
  • ’lease _ renew _ fail _ total’ oʻsishi.
  • `lock_hold_seconds{p99}` > SLO.
  • «Yetim» qulflar (heartbeatsiz).
  • Shoshilinch kutish navbatlari.

10) Amaliy misollar

10. 1 Xavfsiz Redis-qulf bilan fencing (psevdo)

1. Tokenlar hisoblagichini ishonchli saqlash (masalan, Postgres/etcd).
2. Agar «SET NX PX» muvaffaqiyatli bo’lsa, tokenni o’qiymiz/inkrementlaymiz va resursdagi barcha o’zgarishlarni tokenni DB/servisda tekshirish bilan amalga oshiramiz.

python acquire token = db. next_token ("locks/orders/42") # monotone ok = redis. set("locks:orders:42", owner, nx=True, px=ttl_ms)
if not ok:
raise Busy()

critical op guarded by token db. exec("UPDATE orders SET... WHERE id=:id AND:token > last_token",...)
release (compare owner)

10. 2 etcd Mutex + watchdog (Go)

go ctx, cancel:= context. WithCancel(context. Background())
sess, _:= concurrency. NewSession(cli, concurrency. WithTTL(10))
m:= concurrency. NewMutex(sess, "/locks/job/cleanup")
if err:= m. Lock(ctx); err!= nil { /... / }

// Watchdog go func() {
<-sess. Done ()//loss of session/quorum cancel ()//stop working
}()

doCritical (ctx )//must respond to ctx. Done()
_ = m. Unlock(context. Background())
_ = sess. Close()

10. 3 ZKda yetakchilik (Java, Curator)

java
LeaderSelector selector = new LeaderSelector(client, "/leaders/cron", listener);
selector. autoRequeue();
selector. start(); // listener. enterLeadership() с try-finally и heartbeat

10. 4 Postgres advisory lock (SQL + app)

sql
SELECT pg_try_advisory_lock(128765); -- attempt without blocking
-- if false --> return via backoff + jitter

11) Test-pleybuklar (Game Days)

Kvorumni yo’qotish: 1-2 ta etcd tugunini o’chirish → qulfni olishga urinish o’tmasligi kerak.
GC pauza/stop-the-world: egasining oqimini sun’iy ravishda to’xtatib turish → watchdog uzilganligini tekshirish.
Split-brain: qulf egasi va tomoni o’rtasidagi tarmoq bo’linishining emulyatsiyasi → yangi egasi yuqori fencing tokenini oladi, eskisi esa sink tomonidan rad etiladi.
Clock skew/drift: soatni egasidan olish (Redis/lease uchun) → toʻgʻrilik tokenlar/tekshirishlar bilan taʼminlanishiga ishonch hosil qilish.
Crash before release: jarayonning pasayishi → qulf TTL/sessiyadan ozod qilinadi.

12) Anti-patternlar

Tashqi manbaga kirishda fencingsiz toza TTL-qulf.
Toʻgʻrilik uchun lokal vaqtga tayanish (HLC/fencingsiz).
Qulflarni bitta Redis-master orqali feylover bilan muhitda tarqatish.
Cheksiz tanqidiy qism (TTL «asrlar uchun»).
«Begona» qulfni’owner _ id ’/token bilan solishtirmasdan olib tashlash.
Backoff + jitter → «bo’ron» urinishlari yo’qligi.
«Hamma narsaga» yagona global qal’a - mojarolar sumkasi; kalit bo’yicha sharding yaxshiroqdir.

13) Joriy etish chek-varaqasi

  • Resurs turi aniqlandi va CAS/navbat/idempotentlik bilan shug’ullanish mumkinmi?
  • Tanlangan mexanizm: etcd/ZK/Consul CP uchun; Redis/kesh - faqat fencing bilan.
  • Amalga oshirildi:’owner _ id’, TTL + uzaytirish, watchdog, toʻgʻri unlock.
  • Tashqi resurs fencing tokenini tekshiradi.
  • Etakchilik va jinoyatchilik strategiyasi mavjud.
  • Metriklar, alertlar, tokenlar va taftishlarning logotiplari sozlangan.
  • backoff + jitter va acquire taymautlari mavjud.
  • Oʻyin kunlari: kvorum, split-brain, GC pauzalari, clock skew.
  • Bir nechta qulflarni olish tartibi hujjatlari (agar talab qilinsa).
  • Buzilish rejasi (brownout): qulf mavjud boʻlmaganda nima qilish kerak.

14) FAQ

Q: Redis-qulf’SET NX PX’yetarlimi?
A: Agar resurs fencing tokenni tekshirsa. Aks holda, tarmoq bo’linishida ikkita egasi bo’lishi mumkin.

Q: «Andoza» nimani tanlash kerak?
A: Qat’iy kafolatlar uchun - etcd/ZooKeeper/Consul (CP). Bitta DB ichida oson vazifalar uchun - advisory locks Postgres. Redis - faqat fencing bilan.

Q: Qanday TTL qo’yish kerak?
A:’TTL ≥ p99 × 2’tanqidiy qismining davomiyligi va «zombi» ni tezda tozalash uchun etarlicha qisqa. Uzaytirish - har bir’TTL/3’.

Q: Ochlikdan qanday qochish mumkin?
A: Tartib bo’yicha kutish navbati (ZK sequential) yoki fairness-algoritm; urinishlar limiti va adolatli rejalashtirish.

Q: Vaqt sinxronlashuvi kerakmi?
A: To’g’ri bo’lish uchun - yo’q (fencing ishlating). Operatsion bashorat qilish uchun - ha (NTP/PTP), lekin qulf mantig’ida wall-clockga tayanmang.

15) Yakunlar

Ishonchli taqsimlangan blokirovkalar lease + keepalive bilan kvorumli storlarda (etcd/ZK/Consul) quriladi va o’zgaruvchan resurs darajasida fencing token albatta to’ldiriladi. To’siqsiz har qanday TTL/Redis-yondashuvlar - split-breyn xavfi. Avval kauzallik va idempotentlik haqida o’ylang, ularsiz mumkin bo’lmagan joylarda qulflashdan foydalaning, o’lchang, sinov rejimlarini sinab ko’ring - va sizning «tanqidiy bo’limlaringiz» hodisalar soni bo’yicha emas, balki ma’nosi bo’yicha tanqidiy bo’lib qoladi.

Contact

Biz bilan bog‘laning

Har qanday savol yoki yordam bo‘yicha bizga murojaat qiling.Doimo yordam berishga tayyormiz.

Integratsiyani boshlash

Email — majburiy. Telegram yoki WhatsApp — ixtiyoriy.

Ismingiz ixtiyoriy
Email ixtiyoriy
Mavzu ixtiyoriy
Xabar ixtiyoriy
Telegram ixtiyoriy
@
Agar Telegram qoldirilgan bo‘lsa — javob Email bilan birga o‘sha yerga ham yuboriladi.
WhatsApp ixtiyoriy
Format: mamlakat kodi va raqam (masalan, +998XXXXXXXX).

Yuborish orqali ma'lumotlaringiz qayta ishlanishiga rozilik bildirasiz.