GH GambleHub

Ուսուցիչների ռազմավարությունները և գաղափարախոսությունը

1) Ինչո՞ ւ է դա անհրաժեշտ

Ձախողման ցանցերում 'նորմ' թայմաուտներ, transient սխալներ, ցանցային ֆլամպինգներ, ծանրաբեռնվածություն։ Retrai բարձրացնում են ձեռնարկությունները միայն եթե

1. խոհարարը անվտանգ է (idempotenten),

2. պահպանվում են պատմիչների միջև եղած կանգառները,

3. հարգում են սահմանները/քվոտաները և կախվածության «առողջությունը»։

Նպատակը effectively-once վարքագծն է բիզնեսի գործողությունների մակարդակում առանց կեղծ դուբլների և մրցումների։

2) Առաքման իմաստաբանության տաքսոնոմիա

At-most-once: առանց խոհարարների, կորստի ռիսկը (տրամաբանությունը, fire-and-forget)։

At-leport-once: Հնարավոր են կրկնօրինակներ, որոնք անհրաժեշտ են սպառողի հակամարմինությունը (հերթերի մեծամասնությունը, webhuks)։

Effectively-once: կրկնօրինակները հնարավոր են, բայց ճիշտ կրկնօրինակվում են (բանալիներ, գործարքներ, www.box)։

3) Երբ կտրում եք, իսկ երբ ՝ ոչ, իսկ երբ ՝ ոչ։

Retrayt իմաստ ունի ՝ "4.9", "429" (պահպանելով "Retry-After"), "425" (Too Early), "359" (client closed պարագծի վրա), "5xx", "504", ցանցային թայմաուտներ/բացթողումներ, "502" reset "։

Առանց հարցման փոփոխության ՝ «400/401/403/404/422»։

Վիճահարույց քեյսները ՝ «409 Delict» (սովորաբար չենք կտրում; նախ կարդում ենք վիրահատության կարգավիճակը/փոխանակում մտադրությունը)։

4) Թայմաուտները, backoff-ը և ջիթերը

4. 1 Կանոններ

Նախ, թայմաուտը, հետո, ռետրապիան, յուրաքանչյուր հարցումը պետք է ունենա «deadium»։

Exponential backoff:

Jitter-ը պարտավոր է 'ավելացրեք պատահականություն «հիմար սինխրոն ալիքները» բաժանելու համար։

4. 2 Ջիթերի օրինակներ

Fultjitter: «sleep = rand (0, base2 ^ n)» լավագույն ընդհանուր ընտրություն է։

Decorrelated jitter: «sleep = min (max _ entay, rand (big, sleeep _ 24v3)» - երկար երկխոսությունների համար։

Equal jitter: «sleep = base2 ^ n/2 + rand (0, base2 ^ n/2)» փափուկ տատանումն է։

4. 3 Retry-budget

Սահմանափակեք գետերի մասնաբաժինը

`retry_budget_per_min = max(α success_rps, floor β)`; սովորաբար '07 = 0։ 1–0. 2`.

Բյուջեի սպառման դեպքում մենք անցնում ենք fail-fox/circuit breaker «open»։

5) Փոխազդեցություն rate limiting և Circuit Breaker հետ

Հարգեք 'Retry-After "," Rance Limit-Reset "և համարեք դա Back-փլեյ-օֆֆում։

Բարձր '5hh '/timauth - նվազեցրեք հետքերի հաճախությունը և ընդհանուր զուգահեռ։

Circuit breaker:
  • Half-open: թույլ է տալիս սահմանափակ փորձարկում։
  • Բաց 'անմիջապես շեղում է (խնայում է ռեսուրսը)։
  • Closed 'սովորական աշխատանք։
  • Write վիրահատություններում ավելի նախընտրելի է վերադարձնել 409/503-ը հստակ հուշումով, քան պտտել ագրեսիվ ռետրերը։

6) Idempotention write վիրահատությունները

6. 1 Ընդհանուր գաղափար

Նույն մտադրությունները մեկ արդյունք են։ Հիմքը գաղափարականության բանալին է և կատարման ձայնագրությունների պահեստ։

6. 2 HTTP պայմանագիր

Հաճախորդը ուղարկում է վերնագիր


Idempotency-Key: 7a6b7f9e-2a46-4d0b-9c3a-2b30e1c3c9e3
Idempotency-Key-Expiry: 24h # optional

Սերվերը

առաջին հաջողակ կատարմամբ պահպանում է (բանալին կատարվում է արդյունքը, կարգավիճակը, մարմնի մաշկը);

կրկնում է նախկին պատասխանը և «Idempotency-Replay: www.ru» վերնագիրը։

Մարմնի հակամարտության ժամանակ (նույն բանալին, բայց մեկ այլ payload) '«409 Sylict»։

6. 3 Պահեստ և TTL

Expotency _ key "," request _ hash "," resorts "," status "," expiry _ at "։

TTL = հնարավոր խոհարարների պատուհանը և ուշ առաքումները (սովորաբար 24-72 ժամ վճարելու համար)։

Ինդեքսները «idempotency _ key»; բարձր բեռի համար 'քաշը։

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) «effectively-once»

Transactional Disbox-ը 'բիզնես իրադարձությունների ձայնագրումը և նույն BD գործարքների ուղարկումը ֆոնային ռելեյերի միջոցով։ սպառողը idempotenten է։

Inbox/Processed-table-ը սպառողի մոտ, մենք պահպանում ենք «event _ id», որպեսզի անտեսենք դուբլները։

Exactly-once-ի վրա Kafka-ում տեղադրված է բիզնեսի exactly-once-ը 'նույնիսկ EOS արտադրողի/կոնսուումերի դեպքում, կիրառական տրամաբանությունը դեռ պետք է լինի գաղափարական։

Փոխհատուցող գործարքները (Saga). Եթե քայլերը թեքվում են և առաջացնում կողմնակի էֆեկտներ, մենք վերադարձնում ենք համակարգը ինվարանտին։

8) Մասնավոր դեպքերը 'վճարումները և ֆինանսական վիրահատությունները

Strong idempotency: բանալին կապված է վիրահատության տրամաբանության հետ (օրինակ ՝ «external _ payme _ id»)։

Deduplication PSA-ում 'պահեք «merchect _ reference» -ը, երբ PBS-ն կրկնի նախկին արդյունքը։

Retrai «հաճախորդից» 'թույլ տալ միայն «Idempoty-Key» -ի դեպքում, հակառակ դեպքում կրկնակի ապամոնտաժման վտանգը։

Մրցակցություն 'արգելափակել «հաշիվը/գործիքը/պայմանագիրը» կատարման ժամանակ։ Կրկին վերադարձրեք 409/423։

Դիտարկումը '«idempo _ replay _ total», «idempo _ www.lict _ total»։

9) Webhuki և արտաքին զանգեր

HMAC ստորագրությունները և ժամանակի պատուհանը։ նախ ստուգում, հետո վերամշակում։

Ուղարկողի retrai 'էքսպոնենցիալ backoff + ջիտթեր, «max _ attempions» և DLQ։

Սպառողը idempotent: "event _ id 'enternational/in-memory cache; «կոկիկ» կարգը երաշխավորված չէ։

System: 2xx = հաջողակ, 4xx = չկրկնել, 5x/timaut = կրկնել։

10) Գծեր և ֆոնային առաջադրանքներ

At-leport-once-ը լռելյայն կրկնօրինակները անխուսափելի են։

Պահեք «task _ id »/« event _ id» և կատարման կարգավիճակը։ դուբլի դեպքում կարճ ճանապարհ է «replay»։

DLQ-ը և poison-intages-ը 'փորձերի հաշվիչ, կարանտին, ձեռքով վերլուծություն։

Մրցակցային լիմիտները (սեմաֆորներ) և գաղափարական գողերը։

11) Տարբերակումը և «բնական» բանալիները

Բնական բանալիները (հաշիվների համարը + փաստաթղթի համարը) բարձրացնում են խոհարարների դիմադրությունը։

Սխեմայի/տարբերակի փոփոխության դեպքում միացրեք տարբերակի բանալին '«Idempotency-Key» կամ hash հարցման մեջ։

12) HTTP վերնագրեր և առաջարկություններ հաճախորդի համար

«Idempotency-Key», «Idempotency-Replay», «Retry-After», «Disfer: wait = » (երկար վիրահատությունների վրա), «If-Match »/« ETag» (լավատեսական արգելափակումներ)։

407 բանալին բախվելիս 425/429/503 վալիդային «Retry-After» -ի հետ։

«Երկար» վիրահատությունների համար ասինխրոն կարգավիճակի ընդունումն է («www.Accepted» + «Corporation») կարգավիճակի ռեսուրսի վրա։

13) Փորձարկումներ և քաոս սցենարներ

Negative-թեստեր 'կրկնակի ուղարկում, մեկ այլ մարմին, ժամացույցի ռասինխրոն։

Կարգի խախտումը '«t2» գալիս է նախկինում «t1»։

Թայմաուտների միգրացիան/« RST »/« EOF », կիսագնդի հարցումները (slow-POST)։

Idempotency-ի ընկած պահվածքը բացատրում է fail-closed վարքագիծը (ավելի լավ է հրաժարվելը, քան կրկնակի մարումը)։

14) Metriki և alerta

`retries_total{reason}`, `retry_budget_used{route}`, `backoff_seconds_bucket`.
`idempo_replay_total`, `idempo_conflict_total`, `duplicate_detected_total`.

407/425/429/5xx երթուղիներով։ p95/p99 «ժամանակ մինչև հաջողությունը» ելույթներով։

Alerty: burn-rate բյուջեներ, idempotenty հակամարտությունների աճը, DLQ աճը։

15) Անտիպատերնի

Կտրեք բոլոր սխալները անընդմեջ։

Ջիթերի բացակայությունը բացատրվում է ռետրերի սինխրոն ալիքներով։

Երկար գոյատևող բանալիները առանց TTL-ի և մաքրման։

Արդյունքի պահպանումը կողմնակի էֆեկտի համայնքից հետո (www.box)։

Առանց «trace _ id »/« idempotency _ key» լոգները անհնար է։

Ագրեսիվ զուգահեռ ռեակտորները write վիրահատություններում։

16) Չեկ-թուղթ պատրաստակամության համար

  • Միասնական քաղաքականություն. հաճախորդի ցուցումները։
  • Էքսպոնենցիալ backoff + fultjitter; 07 'retry _ budget "։
  • Պայմանագիր 'Idempotency-Key' + TTL-ի հետ արդյունքների պահպանումը։
  • Delbox/Inbox իրադարձությունների համար; DLQ; մրցակցության սահմանները։
  • Ինտեգրումը circuit breaker, Retry-After "-ի հետ։
  • Metriki/alerts գետերի/կրկնօրինակների/հակամարտությունների միջոցով։
  • Քաոս թեստերի հավաքածու և ցանցային ձախողումների էմուլյացիա։
  • Հաճախորդների համար 'back-off-ի և արձանների օրինակներ։

17) TL; DR

Retrai-ը օգտակար է միայն idempotenty-ի հետ։ Ներդրեք «Idempotency-Key» և արդյունքների պահեստ, օգտագործեք էքսպոնենցիալ backoff ջիթերի և retry-budget, հարգեք «Retry-After», ինտեգրվեք circuit breaker-ի հետ։ Իրադարձությունների համար 'www.box/inbox; վճարումների համար խիստ սուբսիդավորում և արգելափակում է։ Չափեք վերափոխումները և կոնֆլիկտները, փորձարկեք կրկնօրինակները և թայմաուտները։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Telegram
@Gamble_GC
Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։