GH GambleHub

Takrorlar strategiyasi va idempotentlik

1) Nima uchun bu zarur?

Tarmoqlarda nosozliklar - norma: taymautlar, transient-xatolar, tarmoq flappinglari, ortiqcha yuklash. Retrajlar faqat quyidagi hollarda ishonchlilikni oshiradi:

1. takrorlash xavfsiz (idempotenten),

2. takrorlash o’rtasidagi chidamlarga rioya qilinadi

3. qaramlik limitlari/kvotalari va «salomatlik» ga hurmat qilinadi.

Maqsad - soxta dubl va poygalarsiz biznes operatsiyalari darajasida effectively-once xulq-atvoridir.

2) Yetkazib berish semantikasining taksonomiyasi

At-most-once: takrorlamasdan, yo’qotish xavfi (loging, fire-and-forget).
At-least-once: dublikatlar bo’lishi mumkin → iste’molchining idempotentligi kerak (aksariyat navbatlar, vebxuklar).
Effectively-once: dublikatlar mumkin, lekin to’g’ri deduplisatsiya qilinadi (kalitlar, tranzaksiyalar, outbox).

3) Qachon retraj qilish, qachon retraj qilish

Retrayt ma’nosi bor:’408’,’429’(’Retry-After’ga rioya qilgan holda),’425’(Too Early),’499’(perimetrda client closed),’5xx’,’504’, tarmoq taymautlari/bo’shliqlari,’502’shlyuzda, «connection reset».
’400/ 401/403/404/422’ soʻrovini oʻzgartirib boʻlmaydi.
Bahsli keyslar:’409 Conflict’(odatda retraim emas; avval operatsiyaning holatini o’qiymiz/niyatni qayta tasdiqlaymiz).

4) Taymautlar, backoff va jitter

4. 1 Qoidalar

Avval taymaut, so’ngra retriyalar: har bir so’rovda «deadline» bo’lishi kerak.
Exponential backoff:’delay _ n = base 2 ^ n’, chegaralanmoqda’max _ delay’.
Jitter majburiy: «ahmoqona sinxron to’lqinlar» ni hal qilish uchun tasodifni qo’shing.

4. 2 Jitter namunalari

Full jitter:’sleep = rand (0, base2 ^ n)’- eng yaxshi umumiy tanlov.
Decorrelated jitter:’sleep = min (max_delay, rand (base, sleep_prev3))’- uzoq dialoglar uchun.
Equal jitter:’sleep = base2 ^ n/2 + rand (0, base2 ^ n/2)’- yumshoq variatsiya.

4. 3 Retry-budget

Retrains ulushini cheklang:
  • `retry_budget_per_min = max(α success_rps, floor β)`; Odatda’α = 0. 1–0. 2`.
  • Agar byudjet tugasa, fail-fast/circuit breaker «open» ga oʻtamiz.

5) rate limiting va Circuit Breaker bilan o’zaro hamkorlik

’Retry-After’,’RateLimit-Reset’ni hurmat qiling va buni bek-off deb hisoblang.
Yuqori’5xx ’/taymautlarda - retraylarning chastotasini va umumiy parallellikni pasaytiring.

Circuit breaker:
  • Half-open: cheklangan namunaga ruxsat beradi.
  • Open: darhol rad etadi (resursni tejaydi).
  • Closed: oddiy ish.
  • Write-operatsiyalarda 409/503 ni agressiv retrajlarni aylantirishdan ko’ra aniq ma’lumot bilan qaytarish afzalroqdir.

6) Write-operatsiyalarning idempotentligi

6. 1 Umumiy g’oya

Bir xil niyat → bitta natija. Asosi - idempotentlik kaliti va ijro yozuvlari ombori.

6. 2 HTTP-kontrakt

Mijoz quyidagi sarlavhani yuboradi:

Idempotency-Key: 7a6b7f9e-2a46-4d0b-9c3a-2b30e1c3c9e3
Idempotency-Key-Expiry: 24h # optional
Server:
  • birinchi muvaffaqiyatli bajarilganda saqlaydi (kalit → natija, maqom, tana xeshi);
  • takrorlanganda, oldingi javobni va’Idempotency-Replay: true’sarlavhasini qaytaradi;
  • tana to’qnashuvida (xuddi shu kalit, lekin boshqa payload) -’409 Conflict’.

6. 3 Saqlash va TTL

Jadval/kalit qiymati:’idempotency _ key’,’request _ hash’,’result’,’status’,’expiry _ at’.
TTL = mumkin bo’lgan takrorlash va kechroq yetkazib berish oynasi (odatda to’lovlar uchun 24-72 soat).
’idempotency _ key’ bo’yicha indekslar; yuqori yuklama uchun - xesh bo’yicha chardlash.

6. 4 Sxema misoli (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 Qayta ishlovchining soxta hujjati

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» patternlari

Transactional Outbox: biznes voqeani yozib olish va fon releyeri orqali xuddi shu DB-tranzaksiyadan xabar yuborish; iste’molchi idempotenten.
Inbox/Processed-table isteʼmolchida: dubllarni eʼtiborsiz qoldirish uchun’event _ id’ni saqlaymiz.
Kafka-da exactly-once biznesda ≠ exactly-once: hatto EOS prodyuser/konsumer bilan ham amaliy mantiq baribir idempotent bo’lishi kerak.
Kompensatsiya tranzaksiyalari (Saga): agar qadamlar orqaga qaytsa va nojo’ya ta’sirlarni keltirib chiqarsa, tizimni invariantga qaytaramiz.

8) Xususiy holatlar: to’lovlar va moliyaviy operatsiyalar

Strong idempotency: kalit operatsiya mantig’iga bog’langan (masalan,’external _ payment _ id’).
PSP deduplikatsiyasi:’merchant _ reference’→ ni saqlang.
«Mijozdan» retraisi: faqat’Idempotency-Key’bilan ruxsat berish, aks holda ikki baravar hisobdan chiqarish xavfi.
Raqobatbardoshlik: bajarish vaqtida «akkauntga/vositaga/shartnomaga» blokirovka qilish; takrorlanganda 409/423 raqamini qaytaring.
Kuzatilganlik:’idempo _ replay _ total’,’idempo _ conflict _ total’metrikalari.

9) Vebxuklar va tashqi qo’ng’iroqlar

HMAC imzolari va vaqt oynasi; avval tekshirish, keyin qayta ishlash.
Jo’natuvchining retraisi: eksponensial backoff + jitter,’max _ attempts’va DLQ.
Iste’molchi - idempotent:’event _ id’→ jadval/in-memory cache; «toza» tartib kafolatlanmagan.
Kodlar: 2xx = muvaffaqiyatli, 4xx = takrorlamang, 5xx/taymaut = takrorlamang.

10) Navbatlar va fon vazifalari

At-least-once andoza → dublikatlar muqarrar.
’task _ id ’/’ event _ id’ va bajarish holatini saqlang; dubli bo’lganda - «replay» qisqa yo’li.
DLQ va poison-messages: urinishlar hisoblagichi, karantin, qoʻlda tahlil qilish.
Raqobat limitlari (semaforlar) va idempotent vorkerlar.

11) Versiyalash va «tabiiy» kalitlar

Natural kalitlar (hisob raqami + sana + hujjat raqami) takrorlashga chidamliligini oshiradi.
Sxema/versiyani oʻzgartirayotganda, «Idempotency-Key» yoki soʻrov xeshiga versiya kalitini kiriting.

12) HTTP-sarlavhalar va mijozga maslahatlar

’Idempotency-Key’,’Idempotency-Replay’,’Retry-After’,’Prefer: wait = <sec>’(uzoq operatsiyalarda),’If-Match ’/’ ETag’(optimistik blokirovkalar).
409 «Retry-After» valid bilan 425/429/503 kalit to’qnashganda.
«Uzoq» operatsiyalar uchun - asinxron maqomni qabul qilish (maqom resursiga’202 Accepted’+’Location’).

13) Test va xaos-stsenariylar

Negative-testlar: ikki marta jo’natish, boshqa tana bilan takrorlash, soatlarning tarqalishi.
Tartib buzilishi:’t2’erta keladi’t1’.
Taymautlarni in’ektsiya qilish/’ RST ’/’ EOF’, yarim so’rovlar (slow-POST).
Yiqilgan idempotency → xatti-harakati (ikki marta hisobdan chiqarishdan koʻra, rad etish yaxshiroqdir).

14) Metrika va alertlar

`retries_total{reason}`, `retry_budget_used{route}`, `backoff_seconds_bucket`.
`idempo_replay_total`, `idempo_conflict_total`, `duplicate_detected_total`.
Yo’nalishlar bo’yicha 409/425/429/5xx ulushi; retralar bilan p95/p99 «muvaffaqiyatga qadar vaqt».
Alertlar: retraylarning burn-rate byudjeti, idempotentlik to’qnashuvlarining ko’payishi, DLQ o’sishi.

15) Antipatternlar

Xatolarni ketma-ket qaytarish.
Jitter yo’qligi → retraylarning sinxron to’lqinlari.
TTL va tozalanmagan uzoq umr ko’radigan kalitlar.
Nojo’ya ta’sirdan so’ng natijani saqlash (outbox buzilishi).
’trace _ id ’/’ idempotency _ key’ → logisiz forensika mumkin emas.
Write operatsiyalarida tajovuzkor parallel retralar.

16) Prod-tayyorlik chek-varaqasi

  • Yagona siyosat: nima retraj, nima yo’q; kodlar va mijozga ko’rsatmalar.
  • Eksponensial backoff + full jitter; berilgan’retry _ budget’.
  • «Idempotency-Key» kontrakti + TTL bilan natijalarni saqlash.
  • Hodisalar uchun Outbox/Inbox; DLQ; raqobatbardoshlik limitlari.
  • Circuit breaker, respect’Retry-After’bilan integratsiya qilish.
  • Retralar/dublikatlar/mojarolar bo’yicha metriklar/alertlar.
  • Xaos-testlar to’plami va tarmoq uzilishlarini emulyatsiya qilish.
  • Mijozlar uchun hujjatlar: arka-off namunalari va maqomi.

17) TL; DR

Retrajlar faqat idempotentlik bilan birga foydalidir. ’Idempotency-Key’ va natijalar omborini kiriting, jitter va retry-budget bilan eksponensial backoff qo’llang,’Retry-After’ni hurmat qiling, circuit breaker bilan integratsiyalashing. Hodisalar uchun - outbox/inbox; to’lovlar uchun - qat’iy dekuplikatsiya va blokirovka. Retraj va ziddiyatlarni o’lchang, dublikat va taymautlarni sinab ko’ring.

Contact

Biz bilan bog‘laning

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

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