Exactly-once semantika
exactly-once aslynda näme
"Exactly-once" köplenç iki dürli zady aňladýar:- Eltip bermek: Habar sarp edijä takyk bir gezek gowşurylar.
- Gaýtadan işlemek: ahyrky zyýanly täsir (DB-de ýazgy, balansyň üýtgemegi, başga hadysanyň çykmagy) eltişler ýa-da synanyşyklar has köp bolsa-da, takmynan bir gezek amala aşyrylar.
Paýlanan ulgamlarda gaýtadan işlemegiň semantikasy barada gürleşmek has ygtybarlydyr. Eltip bermegi takyk bir gezek üpjün etmek kyn (dublikatlar we gaýtalanmalar gutulgysyz), ýöne jemleýji ýagdaýyň ýeke-täk gaýtadan işlemäge deň boljakdygyna göz ýetirip bolar.
Haçan EOS gerek bolsa, haçan gerek däl
Aşakdakylar üçin EOS talap edilýär:- Pul amallary we balanslar: goşa hasapdan çykarmaga ýol berilmeýär.
- Ygtyýarnamalary/kwotalary, billing hasaplaýjylaryny hasaba almak.
- Yzyna gaýtaryp bolmajak daşarky jaňlar (mysal üçin, açaryň bir gezeklik işjeňleşdirilmegi).
- Täsirleri yzyna gaýtarylyp ýa-da öwezini dolup bolýar (saglar, yzyna gaýtarmalar).
- Dükanlarda/dükanlarda wagtlaýyn dublikatlara ýol berilýär.
- Amallary tutuş traktyň üsti bilen çekmekden has arzan.
Model: end-to-end vs. hop-by-hop
Hop-by-hop EOS: Her bölüm (çeşme → prosessor → kabul ediji) öz hereketini takyk bir gezek ulanjakdygyny kepillendirýär.
End-to-end EOS: tutuş zynjyr "faktdan" "sada-effekte" çenli netijäniň ýeke-täk gaýtadan işlemäge deňdigini kepillendirýär.
Iş ýüzünde end-to-end her hopda geleşikleriň we/ýa-da biperwaýlygyň utgaşmasy arkaly gazanylýar.
Esasy gurluşyk bloklary
1. Idempotent amallary
Amalyň açary boýunça şol bir haýyşyň gaýtalanmagy şol netijäni berýär.
Ключи: `idempotency_key`/`event_id`/`operation_id`.
Ýerine ýetiriş: Giriş ýazgysynyň retensiýasy ≥ TTL bilen "gören" amallar tablisasy.
2. "Okaýaryn-bejerýärin-ýazýaryn" amallary (read-process-write)
Işiň bir atom birliginde okamagyň zyýanly täsiri we ösüşi (ofset/pozisiýa) ýazylýar. Bu ädimleriň arasynda ýykylanda "arwahlary" ýok edýär.
3. Wersiýa/SEQUENCE
Agregat üçin wersiýa/hasaplaýjy saklanylýar; üýtgeşmeler diňe 'expected _ version' gabat gelse ulanylýar. Şol bir wakanyň gaýtalanmagy → effektiň wersiýasyny bir gezek ýokarlandyrmaýar.
4. Duplikasiýa
'(consumer_id, event_id)' boýunça ýa-da tebigy 'business _ id' amallary boýunça indeks.
Satuw patternleri
1) Geleşik log + ofseti düzmek bilen geleşik sink
Akym prosessing üçin amatly.
Logdan okaýarys (diňe tassyklanan ýazgylar).
Gaýtadan işlenilýär.
- a) täsirini sink (BD/tablisa) ýazýarys,
- b) "N ofsetden öň okaldy" diýip ýazýarys (şol BB-de).
- Kommit. Restartda hemme zat gysgaldylýar (we ofset göçürilýär) ýa-da hiç zat ýok.
Häsiýetleri: gaýtadan ýerine ýetirmek zyýany ýok; Habar iki gezek okalsa-da, effekt boýunça "takyk bir gezek".
2) Outbox + idempotent konsumer
Amal hyzmatlary-prodýuserler üçin.
Bir DB amalynda: domen ýazgysyny üýtgedýäris we wakany outbox-a ýazýarys.
Republikator wakany şol bir 'event _ id' bilen tekere eltýär.
Konsumerler wakalary idempotent görnüşde ulanýarlar ('event _ id' boýunça deadup).
Häsiýetleri: prodýuser hakykatyň ýitirilmejekdigini kepillendirýär; konsumerler takyk bir netijäni kepillendirýärler.
3) Kafka/Flink meňzeş ulgamlarda EOS (konseptual)
Idempotent prodýuser: ugratmagyň retralarynda dubllardan goraýar.
Prodýuser amallary: topiklere ýazgylar topary + konsumer çalşygy atomiki taýdan jemlenýär; okyjylar 'read _ committed' izolýasiýasyny ulanýarlar.
Prosessing tarapy (state store) baýlygyny saklaýar we ony geleşik bilen bilelikde jemleýär.
Häsiýetleri: iki gezek täsir etmeýär; downstream "görünmeýär".
4) Upsert/merge arkaly idempotent "siki" (sinks)
Sink 'operation _ id '/' event _ id' kabul edýär we 'UPSERT' ýerine ýetirýär... WHERE NOT EXISTS`.
Zyýanly täsir (mysal üçin, hasaplamak) "eýýäm ulanylmady" barlagy bilen atom taýdan ýerine ýetirilýär.
Häsiýetleri: paýlanan amallar bolmazdan, ammar bilen serhetdäki arzan EOS usuly.
Durmuşa geçirmegiň esasy jikme-jiklikleri
Amal kesgitleýjileri
Gaýtalamalar üçin kesgitlenen bolmaly (retrada täze UUID döretmäň).
Durnukly görünmek meýdany bolsun (konsumer/agregat/ulgam üçin).
Duplikasiýa tablisasy
Колонки: `consumer_id`, `operation_id`, `applied_at`, `ttl_expires_at`.
Indeksler '(consumer_id, operation_id)'.
TTL ≥ iň ýokary gaýtalama penjiresi (logyň retensiýasy + potensial gijikdirmeler).
Optimistik bäsdeşlik
Write modelinde agregatyň wersiýasyny saklaň.
Wakany/buýrugy ulananyňyzda 'WHERE version =: expected'; dublikat wersiýasyny artdyrmaz.
Sargyt/tertip
EOS "edil şol tertipde" deň däl. Partiýa açary (agregatyň ähli wakalary → bir partiýa) we/ýa-da "sequence" deňeşdirmesi arkaly yzygiderliligi üpjün ediň.
Idempotent daşarky jaňlar
Howply usullar üçin (mysal üçin, üçünji tarap hyzmatyna HTTP-webhuk) 'Idempotency-Key' goşuň we hyzmatdaşyňyzyň ony goldamagyny talap ediň.
Ýygy-ýygydan duzaklar
EOS diňe bir ýerde: eger sink yhlasly bolsa, ýöne yhlassyz ikinji derejeli wakalary çykarsaňyz, downstream "takmynan köp gezek" alarsyňyz.
Iki kommita: ilki DB-de, soň dellaldaky ofset kommiti - olaryň arasynda ýykylmak täsirleriň gaýtalanmagyny döredýär.
Çig CDC daşardan: DB shemasynyň üýtgemegi sarp edijileriň duýgurlygyny bozýar.
Durnuksyz açarlar: 'operation _ id' wagt/randoma baglydyr we retrada üýtgeýär.
Bahasy we eglişikleri
Gizlinlik: amallar/izolirlenen okalyşlar → p95/p99.
Ammarlaryň artykmaç bahasy: ammar tablisalary, state stores, geleşik ýazgylary.
Ulanmagyň çylşyrymlylygy: amallaryň wagtlary, akymlaryň gaýtadan balansy, "ýapyşan" sessiýalar.
Diagnostika: has köp ýagdaý ("kamitde", "ýaly görünýär read_committed", "yza çekildi").
EOS nokadyny saýlaň: möhüm agregatlar we effektler üçin; galanlaryny idempotentlik we kompensasiýa bilen ýapyň.
exactly-once synagy
1. "Fault-injection": "effekti ýazga aldy" we "ofseti ýazga aldy".
2. Dublikatlar: Şol habary 2-5 gezek soruň, bir effekte göz ýetiriň.
3. Restartlar we gaýtadan balans: workerleri duruzmak/täzeden açmak, goşa gaýtadan işlemegiň ýoklugyny barlamak.
4. Torly flappi: amalyň ortasyndaky wagtlar, kommitiň gaýtalanmagy.
5. Ýük synaglary: nobatlaryň ýokarlanmagy → "geleşikde hemişelik" pese gaçmak ýa-da ýok.
Kiçi şablonlar (psevdo)
Ofset bellikli idempotent sink
pseudo begin tx if not exists(select 1 from dedup where consumer_id=:c and op_id=:id)
then apply_effect(...) -- upsert / merge / add_one_time_action insert into dedup(c, id, applied_at) values(:c,:id, now)
end if update offsets set pos=:pos where consumer_id=:c commit
Agregat wersiýasy bolan buýruk
pseudo begin tx update account set balance = balance +:delta,
version = version + 1 where id=:account_id and version=:expected_version;
if row_count=0 then error CONCURRENT_MODIFICATION commit
Howpsuzlyk we laýyklyk
PII/PCI: Iň az saklaň, "çig" maglumatlaryň ýerine bellikleri ulanyň.
Audit: 'operation _ id', 'trace _ id', netije (APPLIED/ALREADY_APPLIED).
Saklamak syýasaty: Tablisalarda TTL, ofset/loglary arhiwlemek.
Anti-pattern
"Hakyky exactly-once eltip bermek": Ulaglaryň teswirnamasynyň derejesindäki delikleri netijäniň häsiýeti bolmazdan aýyrmak synanyşygy.
Global paýlanan amallar hemme zada: ähli hyzmatlaryň üsti bilen XA/2PC - gowşak we haýal.
Indempotent däl täsirleri garyşdyrmak (mysal üçin, e-mail ofset kommitinden öň iberildi).
Amal açarlarynyň ýoklugy: peýdaly ýüküň "özboluşlylygyna" bil baglamak.
Önümçiligiň çek-sanawy
- Her bir möhüm täsirde idempotent açary bar.
- Okamak üçin ofset/pozisiýa täsir bilen bir amalda kesgitlenýär.
- Atamyň tablisalary indekslenendir; TTL ≥ log retensiýasy.
- Agregatlar üçin optimistik bäsdeşlik bar (wersiýa/sequence).
- Akymlar/topikler "diňe göçme" re modeiminde okalýar (bar bolsa).
- Dublikat we güýz synaglary CI/CD-de bar.
- Daşbordlar: gaýtalamalaryň, şowsuz amallaryň paýy, gulplama wagty, laglar.
- 'Idempotency-Keu '/gaýtalamalar/wagtlar boýunça integratorlar üçin resminamalar.
FAQ
EOS-ny amalsyz üpjün edip bolarmy?
Köplenç hawa - sink 'ow (upsert/merge) we agregatlaryň wersiýalanmagy arkaly. Amallar kepillikleri ýönekeýleşdirýär, ýöne bahany ýokarlandyrýar.
Her kime "exactly-once" gerekmi?
Ýok. Ol gymmat. Öwezini dolmak mümkin bolmadyk ýerde/ýolda nokat hökmünde ulanyň.
EOS bilen e-poçtalary/webhuklary nädip baglanyşdyrmaly?
Habarnamany kommitden öň bufer ediň, effekti düzedenden soň iberiň; 'notification _ id' -ni saklaň we iberiň.
Has möhümi - eltip bermek ýa-da gaýtadan işlemek?
Gaýtadan işlemek. Eltip bermek gaýtalanyp bilner; jemleýji ýagdaý dogry we ýeke-täk bolmalydyr.
Jemi
"Exactly-once", simde goşa däl-de, täsiriň dogrulygy hakda. Oňa idempotentlik, okamagyň täsirini we ösüşini atom taýdan berkitmek, paýhasly partiýa ýerleşdirmek we wersiýa düzgüniniň utgaşmasy bilen ýetilýär. EOS-ny ýalňyşlygyň bahasy kabul edip bolmajak ýerlerde ulanyň we onuň hakykylygyny güýz we goşa synaglar bilen barlaň - ulaga ynanmaň.