Ուսուցիչների ռազմավարությունները և գաղափարախոսությունը
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 - նվազեցրեք հետքերի հաճախությունը և ընդհանուր զուգահեռ։ 6) Idempotention write վիրահատությունները 6. 1 Ընդհանուր գաղափար Նույն մտադրությունները մեկ արդյունք են։ Հիմքը գաղափարականության բանալին է և կատարման ձայնագրությունների պահեստ։ 6. 2 HTTP պայմանագիր Հաճախորդը ուղարկում է վերնագիր Սերվերը առաջին հաջողակ կատարմամբ պահպանում է (բանալին կատարվում է արդյունքը, կարգավիճակը, մարմնի մաշկը); կրկնում է նախկին պատասխանը և «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) 6. 5 Կեղծ արտադրող 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 = 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`. 407/425/429/5xx երթուղիներով։ p95/p99 «ժամանակ մինչև հաջողությունը» ելույթներով։ Alerty: burn-rate բյուջեներ, idempotenty հակամարտությունների աճը, DLQ աճը։ 15) Անտիպատերնի Կտրեք բոլոր սխալները անընդմեջ։ Ջիթերի բացակայությունը բացատրվում է ռետրերի սինխրոն ալիքներով։ Երկար գոյատևող բանալիները առանց TTL-ի և մաքրման։ Արդյունքի պահպանումը կողմնակի էֆեկտի համայնքից հետո (www.box)։ Առանց «trace _ id »/« idempotency _ key» լոգները անհնար է։ Ագրեսիվ զուգահեռ ռեակտորները write վիրահատություններում։ 16) Չեկ-թուղթ պատրաստակամության համար 17) TL; DR Retrai-ը օգտակար է միայն idempotenty-ի հետ։ Ներդրեք «Idempotency-Key» և արդյունքների պահեստ, օգտագործեք էքսպոնենցիալ backoff ջիթերի և retry-budget, հարգեք «Retry-After», ինտեգրվեք circuit breaker-ի հետ։ Իրադարձությունների համար 'www.box/inbox; վճարումների համար խիստ սուբսիդավորում և արգելափակում է։ Չափեք վերափոխումները և կոնֆլիկտները, փորձարկեք կրկնօրինակները և թայմաուտները։
Idempotency-Key: 7a6b7f9e-2a46-4d0b-9c3a-2b30e1c3c9e3
Idempotency-Key-Expiry: 24h # optionalsql
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
);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
`idempo_replay_total`, `idempo_conflict_total`, `duplicate_detected_total`.