Geleşik habarnamasy
Geleşik habarnamasy - ýerli ýagdaýyň üýtgemegi (DB/keş) bilen dellaldaky/şinadaky habarlaryň arasynda sazlaşygy üpjün edýän binagärlik usullarynyň toplumy. Maksat: şowsuzlyklar, retralar, masştablar we multi-tenantlyk ýüze çykan halatynda "ýagdaý düzedildi, habar ýitirilmedi we gaýtalanmady".
1) Eltip bermegiň semantikasy
At-most-once: çalt we arzan, ýitgiler bolup biler, goşa ýok.
At-least-once: habarlary ýitirmeýär, iki gezek bolup biler → idempotentlik talap edilýär.
(Täsirli) Exactly-once: ýitgiler ýok we iş effektleri üçin görünýän goşa ýok, tehniki kombinasiýa (outbox/inbox, prodýuser/konsumer amallary, dedup) arkaly gazanylýar.
2) "Iki ýazgy" näme üçin howply?
Sada logika "ilki DB-e ýazarys, soň tekere ibereris" (ýa-da tersine) ädimleriň arasynda ýykylanda ýyrtylýar: maglumatlar hasaba alyndy we waka ýitdi; ýa-da waka gitdi, ýöne maglumat ýok. Geleşik habarnamasy bu boşlugy ýok edýär.
3) Esasy nusgalar
3. 1 Outbox (öndüriji)
Bir lokal amalda işewürlik üýtgemesini we "outbox" tablisasyna setiri ýazýarys; aýry-aýry publişer outbox okaýar we retralar we backoff bilen dellalda çap edýär. Ýitgiler aýryldy; iki gezek sarp edijileriň idempotentligini öçürýäris.
3. 2 Inbox/Idempotent Consumer (sarp ediji)
Effekti ýerine ýetirmezden ozal, konsumer 'INSERT' -i 'inbox' (consumer, event_id) 'esasy açar hökmünde edýär. Açar gapma-garşylygy = waka eýýäm işlenildi → sypdyrýarys. Şeýlelik bilen "täsirli exactly-once" gazanylýar.
3. 3 Ofset amallary bilen Read-Process-Write
Log-gönükdirilen tekerler üçin şablon: konsumer batç okaýar, şol bir amalda işewürlik üýtgemelerini we "geçen ofseti" ýazga alýar. Kommitden soň dellal habarlary sarp edilen hasaplaýar. Bu "okaldy → ýykyldy → gaýtalandy" täsirinde goşa bolmazdan ýok edýär.
3. 4 Hyzmatara täsirler üçin TSS/Saglar
Ylalaşylan multişag prosesi zerur bolanda, TCC ýa-da saga ulanýarys; habarlar - buýruklaryň/wakalaryň transporty, geleşiklilik bolsa ädimleriň we öwezini dolmagyň derejesinde.
4) Idempotent öndürijiler we konsumerler
Öndüriji: durnukly 'message _ id '/' idempotency _ key', şol bir açar bilen gaýtadan ibermek abonentlerde täze täsir döretmeýär; Düwmäniň yzygiderliligini saklaň.
Konsumer: 'inbox' + biznes-idempotentlik (upsert/merge, iň soňky wersiýasyny barlamak/gözden geçirmek).
5) Tertibi we sebäpliligi
Bir obýektiň wakalary tertipli bolar ýaly, iş açary boýunça (mysal üçin, 'aggregate _ id', 'tenant _ id') partiýa goýuň.
Partiýanyň içinde yzygiderli belgileri/wagt belliklerini saklaň; DLQ-den redaktirlemekde "açar boýunça we yzygiderli" berjaý ediň.
Global tertip möhüm däl bolsa, açar boýunça ýerli tertip beriň we domen üýtgemelerini düzüň.
6) Ofsetler we täsirleri düzetmek
A warianty: "DB-de ofset"
"Iň soňky gaýtadan işlenen ofseti (partition, offset)" domen maglumatlaryňyzy üýtgeden amalyňyza ýazyň. Gaýtadan başlananda, gaýtalanýan täsirden gaça durup, indiki ofsetden dowam etdiriň.
B warianty: "Dellalyň geleşigi"
Käbir dellallar öndürijiniň/konsumeriň bir geleşiginiň çäginde habarlaryň we ofsetleriň atom ýazgysyny goldaýarlar. Elýeterli bolsa ulanyň, ýöne hemişe sarp edijide idempotentlik bilen dolduryň.
7) Retrai, backoff, DLQ
Diňe retraibl-ýalňyşlyklary (wagt, 5xx), eksponensial backoff we jitter bilen gaýtalaň.
Non-retraibl (schema/validasiýa) - metadata (tenant, key, offset, sebäp) bilen derrew DLQ-de.
DLQ-den redrive dozany (batch, rate limit), täzeden başlamazdan ozal shemany barlaň, açar tertibini saklaň.
8) Köp tenantlyk we sebitler
'tenant _ id', 'plan', 'region' -y meta-maglumatlara we partizan açarlaryna goşuň.
Per-tenant fairness: "Şowhunly" müşderi beýlekilerden býudjet çykarmazlygy üçin çap/gaýtadan işlemegi çäklendiriň.
Residency: Habary we outbox-y domen maglumatlary bilen bir sebitde saklaň; sebitara köpeltmeler - asinxron agregatlar.
9) Gözegçilik we audit
Söwda: 'event _ id '/' aggregate _ id '/' saga _ id', ýatmak 'read → process → write/commit'.
Metrikler: çap/gaýtadan işlemek (p95/p99), üstünlikleriň paýy, DLQ-rate, redaktirlemegiň üstünligi, "dublikatlar basyldy".
Logi: üstünlik üçin gysgaça; ýalňyşlyklar barada jikme-jik maglumat (sebäp, synanyşyk, açar, ofset).
Audit: kim redrawil/konki, haýsy batch we haýsy netije bilen.
10) Howpsuzlyk we laýyklyk
Payload-da PII-ni azaldyň; DLQ/loglara geçirilende gizläň.
Daşarky tekerler üçin habarlara gol çekiň/şifrläň; Hyzmatlaryň arasynda mTLS ulanyň.
Saklamak möhletini we "ýatdan çykarmak hukugyny" dolandyryň per tenant/region.
11) Integrasiýanyň nusgawy shemalary
1. Hyzmat çeşmesi (write-side)
Lokal amal: domen ýazgysy + outbox.
Jemgyýetçilik: batçi, 'SKIP LOCKED', backoff, per tenant çäkleri.
Lag 'now − occurred_at'.
2. Sarp ediji hyzmaty (read-side)
Batç okamak → 'INSERT inbox (consumer, event_id)' synanyşygy → Üstünlikli bolsa, effekti ýerine ýetirýäris.
Şol geleşikde "geçen ofseti" ýazýarys (A görnüşi) ýa-da dellalyň geleşigine bil baglaýarys (B görnüşi).
Retrai ýa-da DLQ syýasatda ýalňyşlyk.
3. Proýeksiýa/materiallaşdyrylan görnüş
Diňe idempotent täzelenmeleri (upsert), babyň ykjam açarlary, gözegçilik pullarynyň wagtal-wagtal barlagy.
12) Konfigurasiýa şablonlary (mysal)
yaml producer:
idempotency_key: event_id partition_key: "{tenant_id}:{aggregate_id}"
retry:
max_attempts: 8 initial_ms: 200 max_ms: 8000 strategy: exponential_full_jitter
consumer:
batch: 500 offset_commit: "with_domain_tx" # или "broker_tx"
inbox_enabled: true concurrency_per_partition: 4 dlq:
enabled: true batch_redrive: 200 rate_limit_per_sec: 50 order_by_key: true
observability:
metrics:
- processing_lag_ms
- publish_success_ratio
- dlq_rate
- redrive_success_ratio tracing_tags: [event_id, tenant_id, aggregate_id, partition, offset]
13) Azyk önüminden öň çek-sanawy
- "Iki ýazgy" ýok edildi: prodýuserde outbox ýa-da bir amalda konsumerde ofset we effekti düzetmek.
- Idempotent konsumeri: 'inbox '/dedup-magazineurnaly, amallaryň işewürlik-idempotentligi.
- Işewür açar boýunça partiýa ýerleşdirmek, ýerli tertip berjaý edildi.
- Backoff + jitter retraýlary, ýalňyşlyklaryň klassifikasiýasy, baý meta-maglumatlar bilen DLQ.
- Redrave dozaly, howpsuz; pleýbuklar bar.
- Köp tenant çäkleri we ileri tutulýan ugurlary; tags 'tenant _ id/plan/region'.
- Telemetriýa: laglar, üstünlikleriň paýy, "dublikatlar basyldy", p95/p99 boýunça aladalar.
- PII/retenşna/şifrlemek syýasaty berjaý edildi.
- Synaglar: ädimleriň arasynda ýykylmak, dublikatlar, açar tertibi, köpçülikleýin redaktirleme.
14) Adaty ýalňyşlyklar
Outbox/ofset amallary bolmazdan aýratyn ädimler bilen tekere ibermek we DB-e ýazmak.
Idempotentlik bolmadyk konsumer → zyýanly täsirleri gaýtalaýar.
Global tertip "her niçigem bolsa" - gymmat we seýrek aklanýar; açar tertibi ýeterlikdir.
Çäklendirmesiz köpçülikleýin redaktirleme → ikinji waka.
Treýsingiň ýoklugy/lag-metrik → "gizlin pese gaçmak".
DLQ/loglarda PII garyşdyrma.
15) Çalt reseptler
SaaS-wakalar: Outbox + idempotent konsumer (inbox), partiýa boýunça 'tenant _ id: aggregate _ id'.
ETL/proýeksiýalar: Bir amalda ofsetleri düzetmek bilen Read-process-write, 500-1000, upsert.
Ýokary ýüki: pablişerleriň şardlanmagy, 'SKIP LOCKED', WFQ per tenant, lagyň gözegçiligi.
Berk laýyk zona: sebitleýin outbox, şifrlemek payload, retenşn we redrawow auditi.
Netije
Geleşik habarnamasy - maglumatlary we habarlary birleşdirmek düzgüni. Outbox/inbox, idempotentlik, ofset düzedişleri, effektler we DLQ bilen dolandyrylýan retralar bilen bilelikde global blokirlemezden amaly exactly-once hereketini alarsyňyz we şowsuzlyklar, pikler we çylşyrymly köp tenant amallary bilen SLO saklaýarsyňyz.