GH GambleHub

Paýlanan blokirlemeler

1) Paýlanan blokirlemeler näme üçin (we haçan) zerur?

Paýlanan blokirleme - klasteriň birnäçe düwünleriniň arasyndaky kritiki bölüm üçin özara kadadan çykmagy kepillendirýän mehanizm. Adaty meseleler:
  • Fon meselesi/şeduler üçin liderlik (leader election).
  • Ýeke-täk ýerine ýetirijiniň umumy çeşmäniň üstünden çäklendirilmegi (faýllaryň hereketi, shemanyň göçmegi, aýratyn töleg ädimi).
  • Agregaty yzygiderli gaýtadan işlemek (wallet/order) eger başgaça idempotentlige/tertipleşdirmäge ýetmek mümkin bolmasa.
Gulpy haçan ulanmaly däl:
  • Eger idempotent upsert, CAS (compare-and-set) ýa-da açar nobaty (per-key ordering) edilip bilinse.
  • Eger çeşme kommutatiw amallara ýol berse (CRDT, hasaplaýjylar).
  • Eger mesele bir ammarda geleşik arkaly çözülse.

2) Howplaryň we häsiýetleriň nusgasy

Şowsuzlyklar we kynçylyklar:
  • Tor: gijikdirmeler, bölmek (partition), paketleriň ýitmegi.
  • Prosesler: GC arakesmesi, stop-the-world, gulpdan soň çatryk.
  • Wagt: sagadyň süýşmegi we süýşmegi TTL çemeleşmelerini bozýar.
  • Gaýtadan eýelik etmek: "zombi" -prosess tordan soň henizem gulpuň eýesi diýip pikir edip biler.
Islenýän häsiýetler:
  • Howpsuzlyk: birden köp hakyky eýesi (safety).
  • Diri galmak: eýesi şowsuz bolanda gulp boşadylýar (liveness).
  • Adalat: açlyk ýok.
  • Sagatdan garaşsyzlyk: dogrylyk wall-clock-a bagly däl (ýa-da fencing tokens bilen öwezini dolýar).

3) Esasy modeller

3. 1 Lease (kärende gulpy)

Gulp TTL bilen berilýär. Eýesi onuň möhletini gutarýança uzaltmaga borçludyr (heartbeat/keepalive).

Artykmaçlyklary: kreşde öz-özüňi düzmek.
Töwekgelçilikler: eger eýesi "asylsa" we işini dowam etdirse, ýöne uzaldylmagyny ýitirse, goşa eýeçilik ýüze çykyp biler.

3. 2 Fencing token

Her bir üstünlikli ele geçirilende monoton ösýän nomer berilýär. Resurs sarp edijiler (DB, nobat, faýl saklaýyş) belligi barlaýarlar we köne belgili amallary ret edýärler.
Bu TTL/lease we tor bölünişiklerinde gaty möhümdir - "köne" eýesinden goraýar.

3. 3 Quorum-gulplar (CP-ulgamlar)

Paýlanan ylalaşygy ulanýarlar (Raft/Paxos; etcd/ZooKeeper/Consul), ýazgy konsensus ýazgysy bilen baglanyşyklydyr → düwünleriň köpüsinde bölünen arakesme ýok.

Goşmaça: güýçli howpsuzlyk kepillikleri.
Minus: kworuma duýgurlyk (onuň ýitmegi bilen diri galmak).

3. 4 AP-gulplar (in-memory/kesh + köpeltmek)

Mysal üçin, Redis-klaster. Ýokary elýeterlilik we tizlik, ýöne tor bölünişiklerinde berk howpsuzlyk kepillikleri bolmazdan. Sink tarapynda fencing talap edýär.

4) Platformalar we patternler

4. 1 etcd/ZooKeeper/Consul (strong locks üçin maslahat berilýär)

Efemer düwünleri (ZK) ýa-da sessiýalar/leases (etcd): açar sessiýa diri bolanda bar.
Sessiýa keepalive; kworum ýitirmek → sessiýa gutarýar → gulp boşadylýar.
Garaşmak üçin nobat düwünleri (ZK 'EPHEMERAL _ SEQUENTIAL') → adalat.

Etcd (Go) eskizi:
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 (seresaplylyk bilen)

Klassika - 'SET key value NX PX ttl'.

Meseleler:
  • Replikasiýa/feýlower bir wagtyň özünde eýelerine ýol berip biler.
  • Redlock birnäçe hadysalardan töwekgelçiligi azaldýar, ýöne ýok etmeýär; ygtybarly däl torly gurşawlarda jedelli.

Redis-i çalt koordinasiýa gatlagy hökmünde ulanmak has ygtybarly, ýöne maksatly çeşmede elmydama fencing tokenini doldurmak has ygtybarly.

Mysal (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 BD-gulplar

PostgreSQL advisory locks: Postgres klasteriniň içinde lok (proses/sessiýa).
Möhüm bölümleriň hemmesi bir DB-de bolsa gowy.

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

4. 4 Faýl/bulut "gulplary"

S3/GCS + "If-Match" (ETag) şertleri bolan obýektli meta-maglumat lok → aslynda CAS.
Ekap/migrasiýa üçin amatly.

5) Howpsuz gulpuň dizaýny

5. 1 Eýesiniň şahsyýeti

'owner _ id' (düwün #процесс #pid #start_time) + tötänleýin belgi saklaň.
Gaýtalanýan unlock başga biriniň gulpuny aýyrmaly däldir.

5. 2 TTL we uzaltmak

TTL <T_fail_detect (şowsuzlygy ýüze çykarmak wagty) we kritiki bölümiň ≥ p99 × ätiýaçlyk.
Uzaltmak - wagtal-wagtal (mysal üçin, her 'TTL/3'), deadline bilen.

5. 3 Sinkde fencing token

Daşarky çeşmäni üýtgedýän bölüm 'fencing _ token' geçirmeli.

Sink (DB/kesh/ammar) 'last _ token' saklaýar we kiçisini ret edýär:
sql
UPDATE wallet
SET balance = balance +:delta, last_token =:token
WHERE id =:id AND:token > last_token;

5. 4 Garaşmak we adalat nobaty

ZK - 'EPHEMERAL _ SEQUENTIAL' we synçylar: müşderi iň ýakyn öňküsiniň boşadylmagyna garaşýar.
V etcd - barlagly/wersiýaly açarlar; 'mod _ revision'.

5. 5 Split-brain wagtynda özüni alyp barşy

CP çemeleşmesi: Kworum bolmazdan gulpy alyp bilmersiňiz - howpsuzlygy bozmakdan has gowy duruň.
AP çemeleşmesi: bölünen adalarda öňegidişlige rugsat berilýär → fencing zerur.

6) Liderlik (leader election)

etcd/ZK - "lider" aýratyn epemer açarydyr; galanlary üýtgetmäge gol çekildi.
Lider heartbeats ýazýar; ýitgi - gaýtadan saýlanmak.
Lideriň ähli amallaryna fencing token (döwrüň/barlagyň belgisi) ýoldaş boluň.

7) Ýalňyşlyklar we olary gaýtadan işlemek

Müşderi gulpy aldy, ýöne işe girmezden ozal → kadalar, hiç kim ejir çekmez; TTL/sessiýa boşadylýar.

Gala işiň ortasynda gutardy:
  • Watchdog hökmanydyr: eger uzaltmak şowsuz bolsa - kritiki bölümi kesiň we yzyna/öwezini doluň.
  • Hiç bir "soňrak tamamlamak": gulpsyz möhüm bölümi dowam etdirip bolmaz.

Uzak arakesme (GC/stop-the-world) → uzaldylmady, beýlekisi gulpy aldy. Iş prosesi eýeçiligiň ýitirilendigini (keepalive kanaly) anyklamaly we kesmeli.

8) Dedloklar, ileri tutulýan ugurlar we inwersiýa

Paýlanan dünýäde dedloklar seýrek bolýar (adatça bir gala), ýöne birnäçe gala bar bolsa, almak üçin ýeke-täk tertibi saklaň (lock ordering).
Ileri tutulýan ugurlaryň üýtgemegi: pes derejeli eýesi ýokary derejeli eýeler garaşýança çeşmäni saklaýar. Çözgütler: TTL-çäklendirmeler, preemption (eger işewürlik rugsat berse), resursyň paýlanylyşy.
Agyz beklemek: adalat üçin garaşmak nobatlaryny (ZK-tertipli düwünleri) ulanyň.

9) Gözegçilik etmek

Metrikler:
  • `lock_acquire_total{status=ok|timeout|error}`
  • `lock_hold_seconds{p50,p95,p99}`
  • 'fencing _ token _ value' (monotonluk)
  • `lease_renew_fail_total`
  • 'split _ brain _ prevented _ total' (kworum ýoklugy sebäpli näçe synanyşyk ret edildi)
  • `preemptions_total`, `wait_queue_len`
Giriş/söwda:
  • `lock_name`, `owner_id`, `token`, `ttl`, `attempt`, `wait_time_ms`, `path` (для ZK), `mod_revision` (etcd).
  • Netijesi bolan "acquire → critical section → release" uýalary.
Alertler:
  • Ösüş 'lease _ renew _ fail _ total'.
  • `lock_hold_seconds{p99}` > SLO.
  • "Ýetim" gulplar (heartbeat bolmasa).
  • Garaşmak nobatlary.

10) Amaly mysallar

10. 1 Howpsuz Redis-gulp bilen fencing (psevdo)

1. Token hasaplaýjyny ygtybarly depoda saklaýarys (mysal üçin Postgres/etcd).
2. Üstünlikli bolan ýagdaýynda 'SET NX PX' tokeni okaýarys/inkrement edýäris we DB/hyzmatda tokeni barlamak bilen ähli çeşme üýtgeşmelerini amala aşyrýarys.

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 ZK-da öňdebaryjy (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) Synag oýunlary (Oýun günleri)

Kworum ýitirmek: 1-2 etcd düwünlerini öçürmek → gulpy almak synanyşygy geçmeli däldir.
GC-arakesme/stop-the-world: eýesiniň akymyny emeli usulda saklamak → watchdogyň işini kesýändigini barlamak.
Split-brain: galanyň eýesi bilen tarapynyň arasynda tor bölünişiginiň emulýasiýasy → täze eýesi has ýokary çeňňek belligini alýar, köne - sink tarapyndan ret edilýär.
Clock skew/drift: sagady eýesinden alyp gitmek (Redis/lease üçin) → dogrulygyň bellikler/barlaglar bilen üpjün edilendigine göz ýetirmek.
Crash before release: prosesiň ýykylmagy → TTL/sessiýa boýunça gulp boşadylýar.

12) Anti-patternler

Daşarky çeşmä gireniňizde fencing bolmazdan arassa TTL gulpy.
Dogrulyga ýerli wagt bil (HLC/fencing bolmasa).
Gulplary bir Redis-master arkaly feýlower bilen gurşawda we tassyklamazdan paýlamak.
Tükeniksiz kritiki bölüm (TTL "asyrlar üçin").
"Nätanyş" gulpy 'owner _ id '/token bilen deňeşdirmezden aýyrmak.
Backoff + jitter → "tupan" synanyşyklarynyň ýoklugy.
"Hemme zada" ýeke global gala - gapjyk; açar boýunça şarding has gowudyr.

13) Girizmegiň çek-sanawy

  • Çeşmäniň görnüşi we CAS/nobat/idempotentlik bilen amala aşyrylyp bilinjekdigi kesgitlenildi.
  • Mehanizm saýlandy: CP üçin etcd/ZK/Consul; Redis/keş - diňe fencing bilen.
  • Amala aşyryldy: 'owner _ id', TTL + uzaldyldy, watchdog, dogry açyldy.
  • Daşarky çeşme fencing tokeni (monotonlygy) barlaýar.
  • Liderlik we jenaýatçy strategiýasy bar.
  • Metrikler, töwekgelçilikler, bellikler we barlaglar.
  • Backoff + jitter we acquire-da wagtlar bar.
  • Oýun günleri geçirildi: kworum, split-brain, GC-arakesmeler, clock skew.
  • Birnäçe gulplary almagyň tertibini resminamalaşdyrmak (zerur bolsa).
  • Zaýalanma meýilnamasy (brownout): gulp ýok bolsa näme etmeli.

14) FAQ

Q: Redis-gulp 'SET NX PX' ýeterlikmi?
A: Diňe çeşme fencing tokeni barlasa. Otherwiseogsam, tor bölünişiginde iki eýesi bolup biler.

Q: "Adaty" näme saýlamaly?
A: Berk kepillikler üçin - etcd/ZooKeeper/Consul (CP). Bir DB-de aňsat meseleler üçin - advisory locks Postgres. Redis - diňe fencing bilen.

Q: Haýsy TTL goýmaly?
A: 'TTL ≥ p99 kritiki bölümiň dowamlylygy × 2' we "zombileri" çalt arassalamak üçin ýeterlik gysga. Uzaldylmagy - her 'TTL/3'.

S: Orazadan nädip gaça durmaly?
A: Garaşmak nobaty (ZK sequential) ýa-da fairness-algoritm; synanyşyklaryň çäkleri we adalatly meýilnamalaşdyrmak.

S: Wagt sinhronizasiýasy zerurmy?
A: Dogrulygy üçin - ýok (fencing ulanyň). (NTP/PTP), ýöne galanyň logikasynda wall-clock-a bil baglamaň.

15) Netijeler

Ygtybarly paýlanan bloklar lease + keepalive bilen kworum storlarynda (etcd/ZK/Consul) gurulýar we üýtgeýän çeşme derejesinde fencing tokeni hökman doldurylýar. Diwarsyz islendik TTL/Redis çemeleşmeleri - bölünmek-breýn töwekgelçiligi. Ilki bilen kauzallyk we idempotentlik hakda pikir ediň, onsuz mümkin bolmadyk ýerlerde blokirlemeleri ulanyň, ölçäň, ret ediş reimesimlerini synagdan geçiriň - we "möhüm bölümleriňiz" hadysalaryň sany däl-de, diňe manysy boýunça möhüm bolup galar.

Contact

Biziň bilen habarlaşyň

Islendik sorag ýa-da goldaw boýunça bize ýazyp bilersiňiz.Biz hemişe kömek etmäge taýýar.

Integrasiýany başlamak

Email — hökmany. Telegram ýa-da WhatsApp — islege görä.

Adyňyz obýýektiw däl / islege görä
Email obýýektiw däl / islege görä
Tema obýýektiw däl / islege görä
Habar obýýektiw däl / islege görä
Telegram obýýektiw däl / islege görä
@
Eger Telegram görkezen bolsaňyz — Email-den daşary şol ýerden hem jogap bereris.
WhatsApp obýýektiw däl / islege görä
Format: ýurduň kody we belgi (meselem, +993XXXXXXXX).

Düwmäni basmak bilen siz maglumatlaryňyzyň işlenmegine razylyk berýärsiňiz.