GH GambleHub

Gaýtalama strategiýalary we idempotentlik

1) Bu näme üçin zerur?

Torlarda şowsuzlyklar - norma: wagt, transient-ýalňyşlyklar, tor flappingleri, aşa ýüklemek. Retraýalar diňe şu ýagdaýlarda ygtybarlylygy ýokarlandyrýar:

1. gaýtalamak howpsuz (idempotenten),

2. gaýtalanmalaryň arasynda saklanylýar,

3. garaşlylygyň çäklerine/kwotalaryna we "saglygyna" hormat goýulýar.

Maksat - ýalan goşa we ýaryşsyz iş amallary derejesinde effectively-once özüni alyp barşy.

2) Eltip bermegiň semantikasynyň taksonomiýasy

At-most-once: gaýtalanmazdan, ýitgi töwekgelçiligi (logirovka, fire-and-forget).
At-least-once: dublikatlar bolup biler → sarp edijiniň idempotenti gerek (nobatlaryň köpüsi, webhuklar).
Effectively-once: dublikatlar mümkin, ýöne dogry duplizirlenilýär (açarlar, amallar, outbox).

3) Haçan yzyna gaýtarmaly, haçan yzyna gaýtarmaly däl

Retraitiň manysy bar: '408', '429' ('Retry-After'), '425' (Too Erly), '499' (perimetrde client closed), '5xx', '504', tor wagtlary/arakesmeleri, '502' şlýuz, "connection reset".
Soragy üýtgetmezden yza çekilmez: '400/ 401/403/404/422'.
Jedelli ýagdaýlar: '409 Conflict' (adatça retraim däl; ilki bilen amalyň ýagdaýyny okaýarys/niýeti tassyklaýarys).

4) Taýmautlar, backoff we jitter

4. 1 Düzgünler

Ilki wagt gutarýar, soň bolsa yza çekilýär: her haýyşda "deadline" bolmaly.
Exponential backoff: 'delay _ n = base 2 ^ n', çäklendirýäris 'max _ delay'.
Jitter hökmanydyr: "samsyk sinhron tolkunlary" aýyrmak üçin tötänlik goşuň.

4. 2 Jitter şablonlary

Full jitter: 'sleep = rand (0, base2 ^ n)' - iň gowy umumy saýlaw.
Decorrelated jitter: 'sleep = min (max_delay, rand (base, sleep_prev3))' - uzak gepleşikler üçin.
Equal jitter: 'sleep = base2 ^ n/2 + rand (0, base2 ^ n/2)' - ýumşak üýtgeşiklik.

4. 3 Retry-budget

Retraýlaryň paýyny çäklendiriň:
  • `retry_budget_per_min = max(α success_rps, floor β)`; Adatça 'α = 0. 1–0. 2`.
  • Býudjet gutaranda - "açyk" fil-fast/circuit breaker geçýäris.

5) rate limiting we Circuit Breaker bilen özara gatnaşyk

'Retry-After', 'RateLimit-Reset' -e hormat goýuň we ony arka aýlawda hasaplaň.
Ýokary '5xx '/wagtlarda - retraýlaryň ýygylygyny we umumy paralelligi peseldiň.

Circuit breaker:
  • Half-open: çäkli synaga rugsat berýär.
  • Açyk: Derrew ret edýär (tygşytlaýar).
  • Closed: adaty iş.
  • Write-amallarda 409/503-i agressiw retraýlary öwürmekden has aýdyň yşarat bilen yzyna gaýtarmak has gowudyr.

6) Write-amallaryň idempotentligi

6. 1 Umumy pikir

Şol bir niýet → bir netije. Esasy - idempotentligiň açary we ýerine ýetiriş ýazgylarynyň saklanylyşy.

6. 2 HTTP-şertnama

Müşderi sözbaşyny iberýär:

Idempotency-Key: 7a6b7f9e-2a46-4d0b-9c3a-2b30e1c3c9e3
Idempotency-Key-Expiry: 24h # optional
Serwer:
  • ilkinji üstünlikli ýerine ýetirilende saklaýar (açar → netije, status, beden heşi);
  • gaýtalananda öňki jogabyny we "Idempotency-Replay: true" sözbaşysyny berýär;
  • beden gapma-garşylygynda (şol bir açar, ýöne başga bir töleg) - '409 Conflict'.

6. 3 Ammar we TTL

Tablisa/açar bahasy: 'idempotency _ key', 'request _ hash', 'result', 'status', 'expiry _ at'.
TTL = bolup biljek gaýtalanmalar we giç eltip bermek penjiresi (adatça tölegler üçin 24-72 sagat).
Indeksler 'idempotency _ key'; ýokary ýük üçin - heş boýunça şardlamak.

6. 4 Shema mysaly (SQL)

sql
CREATE TABLE idempo_store (
key UUID PRIMARY KEY,
req_hash BYTEA NOT NULL,
status INT NOT NULL,
response JSONB NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
expiry_at TIMESTAMPTZ NOT NULL
);

6. 5 Işläp taýýarlaýjynyň ýalan resminamasy

pseudo handle_write(req):
k = req. headers["Idempotency-Key"]
h = hash(req. body)
rec = idempo_store. get(k)

if rec and rec. req_hash == h:
return rec. status, rec. response, {"Idempotency-Replay": "true"}

if rec and rec. req_hash!= h:
return 409, problem("IDEMPOTENT_CONFLICT")

begin tx result = apply_business_mutation (req) # change status upsert once (idempo_store, key = k, req_hash=h, status = 201, response = result, expiry = now () + 2d)
commit

return 201, result

7) "effectively-once" patternleri

Transactional Outbox: iş wakasyny ýazga almak we fon iberijisi arkaly şol bir DB amalyndan habar ibermek; sarp ediji idempotenten.
Inbox/Processed-table ulanyjyda: jübütleri äsgermezlik etmek üçin 'event _ id' -ni saklaýarys.
Kafka-da exactly-once ≠ işde exactly-once: EOS prodýuser/konsumer bilen hem amaly logika henizem idempotent bolmaly.
Öwezini dolmak amallary (Saga): ädimler yza çekilse we zyýanly täsirlere sebäp bolsa, ulgamy üýtgewsizlige gaýtarýarys.

8) Hususy ýagdaýlar: tölegler we maliýe amallary

Strong idempotency: açar amalyň logikasyna birikdirildi (mysal üçin 'external _ payment _ id').
PSP-de duplikasiýa: 'merchant _ reference' → -ni saklaň.
"Müşderiden" retraýalary: diňe 'Idempotency-Key' -de rugsat bermek, ýogsam goşa hasapdan çykarmak töwekgelçiligi.
Bäsdeşlik ukyby: ýerine ýetiriş wagty üçin "hasaby/guraly/şertnamany" blokirlemek; gaýtalananda 409/423 yzyna gaýtaryň.
Syn edilişi: 'idempo _ replay _ total', 'idempo _ conflict _ total' metrikleri.

9) Webhuklar we daşarky jaňlar

HMAC gollary we wagt penjiresi; ilki barlamak, soň gaýtadan işlemek.
Iberijiniň retraýalary: eksponensial backoff + jitter, 'max _ attempts' we DLQ.
Sarp ediji - idempotent: 'event _ id' → tablisa/in-memory cache; "tertipli" tertip kepillendirilmeýär.
Kodlar: 2xx = üstünlikli, 4xx = gaýtalanmaýar, 5xx/wagt = gaýtalanýar.

10) Nobatlar we fon wezipeleri

At-least-once → dublikatlar gutulgysyz.
'task _ id '/' event _ id' we ýerine ýetiriş ýagdaýyny saklaň; iki gezek - "replay" gysga ýoly.
DLQ we poison-messages: synanyşyk hasaplaýjy, karantin, el derňewi.
Bäsdeşlik çäkleri (semaforlar) we dempotent workerler.

11) Wersiýalaşdyrmak we "tebigy" açarlar

Tebigy açarlar (hasap belgisi + senesi + resminama belgisi) gaýtalanmalara garşylygy ýokarlandyrýar.
Shema/wersiýany üýtgedeniňizde, 'Idempotency-Key' -de ýa-da soragyň heşinde wersiýa açaryny açyň.

12) HTTP-sözbaşylar we müşderä maslahatlar

'Idempotency-Key', 'Idempotency-Replay', 'Retry-After', 'Prefer: wait = <sec>' (uzak amallarda), 'If-Match '/' ETag' (optimistik blokirlemeler).
409 "Retry-After" bilen 425/429/503 açar gapma-garşylygynda.
"Uzyn" amallar üçin - asinkron statusyny kabul etmek (status çeşmesine '202 Accepted' + 'Location').

13) Synag we bulam-bujarlyk ssenariýalary

Negative-synaglar: iki gezek ibermek, başga bir beden bilen gaýtalamak, sagadyň bölünişi.
Tertibi bozmak: 't2' -den has ir 't1' -dir.
/ 'RST '/' EOF', ýarym haýyşlar (slow-POST).
Ýykylan idempotency → fil-closed özüni alyp barşy (iki gezek hasapdan çykarmakdan has gowy ret).

14) Metrikler we alertler

`retries_total{reason}`, `retry_budget_used{route}`, `backoff_seconds_bucket`.
`idempo_replay_total`, `idempo_conflict_total`, `duplicate_detected_total`.
Ugurlar boýunça paýy 409/425/429/5xx; p95/p99 retralar bilen "üstünlik gazanmak üçin wagt".
Alertler: retraýlaryň burn-rate býudjeti, dempotentlik gapma-garşylyklarynyň köpelmegi, DLQ-iň ösüşi.

15) Antipatternler

Hatalaryň hemmesini yzly-yzyna täzeden düzüň.
Jitteriň ýoklugy → retraýlaryň sinhron tolkunlary.
TTL we arassalanmazdan uzak ömürli açarlar.
Netijäni gapma-garşylykly täsirden soň saklamak (outbox bozulmasy).
'trace _ id '/' idempotency _ key' → -siz loglar forensika bolup bilmez.
Write amallarynda agressiw paralel retraýlar.

16) Prod-taýynlyk çek-sanawy

  • Bir syýasat: näme retraim, näme ýok; müşderä kodlar we maslahatlar.
  • Eksponensial backoff + full jitter; berlen 'retry _ budget'.
  • "Idempotency-Key" şertnamasy + TTL bilen netijeleri saklamak.
  • Wakalar üçin Outbox/Inbox; DLQ; bäsdeşlik çäkleri.
  • Circuit breaker, respect 'Retry-After' bilen integrasiýa.
  • Retralar/dublikatlar/gapma-garşylyklar boýunça metrikler/alertler.
  • Bulam-bujarlyk synaglary we tor şowsuzlyklarynyň emulýasiýasy.
  • Müşderiler üçin resminamalar: arka-offlaryň we statuslaryň mysallary.

17) TL; DR

Retraýalar diňe dempotentlik bilen bilelikde peýdalydyr. "Idempotency-Key" -i we netijeleriň ammaryny giriziň, jitter we retry-budget bilen eksponensial backoff ulanyň, "Retry-After" -e hormat goýuň, circuit breaker bilen integrasiýa ediň. Wakalar üçin - outbox/inbox; tölegler üçin - berk aýyrma we blokirleme. Retralary we gapma-garşylyklary ölçäň, dublikatlary we wagtlary synagdan geçiriň.

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.

Telegram
@Gamble_GC
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.