GH GambleHub

Стратегияҳои такрорӣ ва аблаҳӣ

1) Чаро ба шумо лозим аст

Дар шабакаҳо, нокомӣ як меъёр аст: танаффус, хатогиҳои муваққатӣ, флаппинги шабака, изофабор. Рафторҳо эътимоднокиро танҳо дар сурате беҳтар мекунанд, ки:

1. такрори бехатар (idempotent),

2. таъхири байни такрорӣ мушоҳида мешавад,

3. маҳдудиятҳо/квотаҳо ва вобастагиҳои "саломатӣ" эҳтиром карда мешаванд.

Ҳадаф рафтори самаранок дар як вақт дар сатҳи амалиётҳои тиҷорӣ бидуни гирифтани нажодҳо ва нажодҳо мебошад.

2) Таксономияи семантикаи таҳвил

Дар аксар ҳолатҳо: такрори такрорӣ, хатари талафот (воридшавӣ, оташ ва фаромӯш).
Ҳадди аққал як бор: нусхабардорӣ имконпазир аст → idempotence истеъмолкунандагон лозим аст (аксари навбатҳо, вебҳукҳо).
Самаранок як маротиба: нусхабардорӣ имконпазир аст, аммо дуруст ҷудо карда шудааст (калидҳо, транзаксияҳо, қуттиҳо).

3) Кай даст кашидан ва кай не

Бозгашт маъно дорад: '408', '429' (мушоҳидаи 'Retry-After'), '425' (Хеле барвақт), '499' (муштарӣ дар периметри пӯшида), '5xx', '504', танаффусҳои шабака/танаффусҳо, '502' дар дарвоза, "барқароркунии пайвастшавӣ".
Бе тағир додани дархост бозпас нагиред: '400/ 401/403/404/422'.
Парвандаҳои баҳснок: '409 низоъ' (на одатан ҷазо; аввал мо ҳолати амалиётро мехонем/ниятро тасдиқ мекунем).

4) Вақтсанҷӣ, ақибмонӣ ва ҷиттер

4. 1 Қоидаҳо

Вақти аввал, баъд ретро: ҳар як дархост бояд "мӯҳлат" дошта бошад.
Бозгашти экспоненсиалӣ: 'delay _ n = base 2 ī n', limit 'max _ delay'.
Jitter талаб карда мешавад: барои коҳиш додани "мавҷҳои синхронии кунди" тасодуфӣ илова кунед.

4. 2 Намунаҳои Jitter

Ҷиттери пурра: 'хоб = ранд (0, base2 ī n)' беҳтарин интихоби умумӣ мебошад.
Ҷиттери ороишӣ: 'хоб = мин (max_delay, ранд (пойгоҳ, sleep_prev3))' - барои муколамаҳои дароз.
Ҷиттери баробар: 'хоб = base2 = n/2 + rand (0, base2 * n/2)' - варианти мулоим.

4. 3 Такрори буҷа

Маҳдудияти таносуби бозпардохтҳо:
  • 'retry _ budget _ per _ min = max (α success_rps, ошёна β)'; одатан 'α = 0. 1–0. 2`.
  • Агар буҷа тамом шавад, ба шикастани суръати тез/ноҳиявӣ "кушода" гузаред.

5) Ҳамкорӣ бо маҳдудкунии суръат ва шикастани гардиш

Эҳтиром ба 'Retry-After', 'Rate' Limit-Reset 'ва онро дар бозгашт ҳисоб кунед.
Дар вақти баланд '5xx '/танаффус - басомади бозсозӣ ва мувофиқати умумиро паст кунед.

Қатъи гардиш:
  • Нисфи кушода: Интихоби маҳдуд имкон медиҳад.
  • Кушодан: фавран рад мекунад (захираро сарфа мекунад).
  • Пӯшида: кори оддӣ.
  • Ҳангоми навиштани амалиёт, баргардонидани 409/503 бо ишораи возеҳ нисбат ба такрори хашмгин беҳтар аст.

6) Номутобиқатии амалиёти навиштан

6. 1 Идеяи умумӣ

Ҳамин ниятҳо → як натиҷа. Асос калиди idempotence ва нигоҳдории сабтҳои иҷро мебошад.

6. 2 HTTP шартнома

Мизоҷ сарлавҳаро мефиристад:

Idempotency-Key: 7a6b7f9e-2a46-4d0b-9c3a-2b30e1c3c9e3
Idempotency-Key-Expiry: 24h # optional
Хидматрасон:
  • Нигоҳ доштан (калид, натиҷа → ҳолати бадан, hash бадан) дар бораи муваффақияти аввал
  • агар такрор шавад, ҷавоби кӯҳна ва сарлавҳаи 'Idempotency-Replay: дуруст' -ро бармегардонад;
  • дар ҳолати муноқишаи бадан (ҳамон калид, аммо бори дигар) - '409 низоъ'.

6. 3 Нигоҳдорӣ ва TTL

Калиди ҷадвал/арзиш: 'idempotency _ key', 'request _ hash', 'натиҷа', 'status', 'expiry _ at'.
TTL = равзанаи такрори имконпазир ва таҳвили дер (одатан 24-72 соат барои пардохт).
Нишондиҳандаҳо аз рӯи 'idempotency _ key'; барои сарбории баланд - hash sharding.

6. 4 Намунаи схема (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 Псевдокоди дастӣ

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) намунаҳои "самаранок-як"

Outbox Transaction: сабти як чорабинии корӣ ва фиристодани паём аз як транзаксияи пойгоҳи додаҳо тавассути релеи пасзамина; истеъмолкунанда idempotent аст.
Паёмдони/Мизи коркардшуда дар истеъмолкунанда: 'event _ id' -ро сарфа кунед, то нусхаҳоро нодида гиред.
Маҳз як маротиба дар Кафка маҳз як маротиба дар тиҷорат: ҳатто бо истеҳсолкунанда/истеъмолкунандаи EOS, мантиқи татбиқшаванда бояд то ҳол бефоида бошад.
Амалиётҳои ҷуброншаванда (Saga): агар қадамҳо бозпас гирифта, таъсири манфӣ расонанд, мо системаро ба ғайривариант бармегардонем.

8) Ҳолатҳои махсус: пардохтҳо ва амалиётҳои молиявӣ

Идемпотенсияи қавӣ: Калид ба мантиқи амалиёт вобаста аст (масалан, 'external _ pay _ id').
Ҷойгиркунӣ дар PSP - Store 'савдогар _ истинод' → агар такрор шавад, PSP ҳамон натиҷаро бармегардонад.
Бозгашти "аз муштарӣ": танҳо вақте иҷозат диҳед, ки 'Idempotency-Key', вагарна хатари аз ҳисоб баровардани дубора.
Озмун: қуфлҳо "дар ҳисоб/асбоб/шартнома" барои давомнокии иҷро; ҳангоми такрор, 409/423 баргардед.
Мушоҳида: ченакҳои 'idempo _ replay _ total', 'idempo _ conflict _ total'.

9) Вебхукҳо ва мушкилоти беруна

Имзои HMAC ва равзанаи вақт; аввал санҷиш, баъд коркард.
Бозхонди ирсолкунанда: бозгашти экспоненсиалӣ + ҷиттер, 'max _ кӯшишҳо' ва DLQ.
Истеъмолкунанда - idempotent: 'event _ id' → ҷадвал/кэши хотира; фармоиши "тоза" кафолат дода намешавад.
Рамзҳо: 2xx = муваффақ, 4xx = такрор накунед, 5xx/timeout = такрор кунед.

10) Навбатҳо ва вазифаҳои пасзамина

Ҳадди аққал як маротиба бо нобаёнӣ → нусхабардорӣ ногузир аст.
Нигоҳ доштани 'task _ id '/' event _ id' ва ҳолати иҷро; бо нусхаҳо - роҳи кӯтоҳ "такрорӣ".
DLQ ва заҳролудшавӣ: ҳисобкунаки кӯшиш, карантин, таҳлили дастӣ.
Маҳдудиятҳои рақобатӣ (семафорҳо) ва коргарони бекас.

11) Калидҳои амудӣ ва "табиӣ"

Калидҳои табиӣ (рақами ҳисоб + сана + рақами ҳуҷҷат) муқовиматро ба такрор зиёд мекунанд.
Ҳангоми тағир додани схема/версия, калиди версияро дар 'Idempotency-Key' ё дар хэш дархост дохил кунед.

12) HTTP сарлавҳаҳо ва ба муштарӣ муроҷиат мекунад

'Idempotency-Key', 'Idempotency-Replay', 'Retry-After', 'Бартарӣ: интизор шудан = <sec>' (дар амалиёти дароз), 'If-Match '/' ET' (қуфлҳои оптимистӣ).
409 барои муноқишаи калидӣ бо 'Retry-After' дуруст аст.
Барои амалиёти "дароз" - қабули ҳолати асинхронӣ ('202 Қабулшуда' + 'Ҷойгиршавӣ' барои як манбаъ).

13) Сенарияҳои озмоишӣ ва бетартибӣ

Санҷишҳои манфӣ: фиристодани дукарата, такрор бо бадани дигар, desynchronization соат.
Аз фармоиш: 't2' пеш аз 't1' меояд.
Тазриқи танаффус/' RST '/' EOF ', дархостҳои нисфи (slow-POST).
Нигоҳдории idempotency афтода → рафтори пӯшида (нокомии беҳтар аз аз сабти дубора).

14) Нишондиҳандаҳо ва огоҳиҳо

'reties _ total {reail}', 'retry _ budget _ used {route}', 'backoff _ seconds _ bucket'.
'idempo _ replay _ total', 'idempo _ contrast _ total', 'duplickate _ detined _ total'.
Бо хатсайрҳо 409/425/429/5xx мубодила кунед; p95/p99 "вақти муваффақият" бо ақибнишинӣ.
Огоҳиҳо: буҷаи бозпас гирифтани сатҳи сӯзондан, афзоиши муноқишаҳои аблаҳӣ, афзоиши DLQ.

15) Антипаттернҳо

Ҳама хатогиҳоро дар як саф бартараф кунед.
Набудани jitter → мавҷҳои синхронии ретсессҳо.
Калидҳои дарозмуддат бе TTL ва тозакунӣ.
Нигоҳ доштани натиҷа пас аз содир кардани таъсири тараф (вайронкунии қуттии қуттӣ).
Гузоришҳои бидуни 'trace _ id '/' idempotency _ key' тавлид кардан § ғайриимкон аст.
Бозгашти параллелии хашмгин ба амалиёти навиштан.

16) Рӯйхати санҷиши омодагии Prod

  • Сиёсати ягона: кадом ҷазо, чӣ не; рамзҳо ва дархостҳои муштариён.
  • Бозгашти экспоненсиалӣ + jitter пурра; 'retry _ буҷа' муайян карда шудааст.
  • Натиҷаҳои нигоҳдории шартнома 'Idempotency-Key' + бо TTL.
  • Outbox/Inbox барои рӯйдодҳо; DLQ; маҳдудиятҳои рақобатӣ.
  • Ҳамгироӣ бо шикастани схема, эҳтиром 'Retry-After'.
  • Нишондиҳандаҳо/Огоҳиҳо аз ҷониби Retray/Duplicate/Ихтилоф.
  • Маҷмӯи озмоишҳои бетартибӣ ва тақлид кардани нокомии шабака.
  • Ҳуҷҷатҳои муштариён - намунаҳои нусхабардорӣ ва статусҳо.

17) TL; ДР

Рафторҳо танҳо дар якҷоягӣ бо idempotency муфиданд. 'Idempotency-Key' ва нигаҳдории натиҷаҳоро ворид кунед, бозгашти экспоненсиалиро бо ҷиттер ва такрори буҷет истифода баред, эҳтиром 'Retry-After', бо вайронкунандаи схема ҳамроҳ шавед. Барои чорабиниҳо - қуттӣ/паёмдони; барои пардохтҳо, ихтисороти қатъӣ ва қуфлҳо. Бозсозӣ ва низоъҳо, такрори санҷишҳо ва вақтро чен кунед.

Contact

Тамос гиред

Барои саволҳо е дастгирӣ ба мо муроҷиат кунед.Мо ҳамеша омодаем!

Telegram
@Gamble_GC
Оғози интегратсия

Email — муҳим аст. Telegram е WhatsApp — ихтиерӣ.

Номи шумо ихтиерӣ
Email ихтиерӣ
Мавзӯъ ихтиерӣ
Паем ихтиерӣ
Telegram ихтиерӣ
@
Агар Telegram нависед — ҷавобро ҳамон ҷо низ мегиред.
WhatsApp ихтиерӣ
Формат: рамзи кишвар + рақам (масалан, +992XXXXXXXXX).

Бо фиристодани форма шумо ба коркарди маълумот розӣ ҳастед.