Circuit Breaker և դեգրադացիա
Circuit Breaker (CB) պաշտպանիչ պաթթերն է, որը ընդհատում է դեգրադացված կախվածության մարտահրավերները, որպեսզի տեղայնացնի ձախողումը և պաշտպանի ապաստարանը և օգտագործողը։ Degradation (graceful degradation) - ֆունկցիոնալության գիտակցական պարզեցում ռեսուրսների կամ նվազեցման (օրինակ ՝ կանխված/թերի տվյալները, «թանկ» ֆիչի անջատումը) առանց ամբողջովին դաունտայմի։
Հիմնական նպատակն է պահպանել SLO-ը և օգտագործողի փորձը վերահսկվող ձախողումների պատճառով, կասկադային անկումների փոխարեն։
1) Ե՞ րբ կիրառել
Կախվածությունը անկայուն է 'p95/p99, թայմաուտներ, սխալ պատասխաններ։
Արտաքին API-ը կոշտ սահմաններով/տուգանային։
«Ծանր» backends (որոնում, առաջարկություններ, հաշվետվություններ), որտեղ ռելսերը մեծացնում են փոթորիկը։
Բարձր բեռնված հատվածները փամփուշտների ոչնչացումից (միացություններ, տրեդներ)։
2) CB վիճակը և անցումը
Դասական երեքը
1. Closed-ը գնում է, սխալները/լատենտները համարվում են։
2. Բաց - զանգերը անմիջապես շեղվում են (fail-fox) և/կամ թարգմանվում են fallback-ով։
3. Half-Open-ը, «փորձարկման» հարցումների սահմանափակ քանակը որոշում է, թե արդյոք անջատիչը փակել։
Բացահայտման գործիքներ
Սխալների/թայմաուտների շեմն պատուհանի հետևում (օրինակ, N վերջին 50 տոկոսը)։
Լատենտության շեմն (օրինակ, p95> ռուսական արժեքներ)։
Համակցված քաղաքականությունները (սխալները նպաստում են թայմաուտի ավելցուկին)։
Պահպանման ժամանակը (cool-down)
Ֆիքսված (օրինակ, 10-60 վայրկյան) կամ հարմարվողական (էքսպոնենցիալ աճը կրկնվող գործիքների ժամանակ)։
3) Թայմաուտները, ռեթերը և ջիտթերը
Թայմաուտները միշտ ավելի կարճ են, քան SLO apstrima-ը և համաձայնվում են շղթայի միջոցով (deadom propagation)։
Retrai միայն idempotent վիրահատությունների համար։ 1-2 փորձերը շատ դեպքերում բավարար են։
Backoff + jitter (fultjitter) կանխում է խոհարարների սինխրոն ալիքները։
Hedging (պահեստային հարցումներ) տնտեսապես և միայն շատ քննադատական ընթերցումների համար։
4) Bulkhead-մեկուսացում և «ապահովիչներ»
Բաժանեք փամփուշտները 108/գողերի/հերթերի օրինակներով և տիպերով (VIP, ֆոնային առաջադրանքներ, հանրային API)։
Caps-ը concurrency-ում «թանկ» վիրահատությունների համար։
Admission control: Հեշտ հրաժարվելը մինչև հերթը լրանալը։
5) Fallback-ը և քայքայման սցենարները
Տարբերակներ
Քաշ/սթեյլ պատասխաններ ՝ «stale-while-revalidate», L2/L3 քեշից ստացված տվյալները։
Read-only: բլոկը գրել/թիմեր, թույլ տալ անվտանգ ընթերցումներ։
Surrogate պատասխանները 'թերի տվյալներ (օրինակ ՝ առանց ռուսական/ավատարների)։
Ֆունկցիոնալ անջատումը 'ժամանակավորապես թաքցնել ոչ քննադատական վիջեթները/ֆիչին։
Feature flags 'արագ վարքագծային փոփոխություն առանց ռոտացիայի։
Կանոնները
Fallback-ը պետք է լինի դետերմինացված, արագ և անվտանգ տվյալներով։
Հստակ խոչընդոտեք դեգրադացված ուղին լոգարաններում/թրեյսներում/մետրերում։
6) Գերակայություն և ֆիքսված շեյպինգ
VIP/վճարովի պլանները ավելի մեծ գերակայություն/քվոտաներ են պակասի դեպքում։
Rate limits-ը և throttling-ը նվազեցնում են դեգրադացված կախվածության բեռը։
Shed load 'որակի փափուկ նվազեցում (օրինակ, ավելի քիչ արդյունքներ, կտրված պատկերներ) մինչև 108։
7) Դիտողությունն ու սիգնալինգը
CB մետրիկները
Վիճակը (closed/open/half-open) և տևողությունը վիճակում։
Ձախողումների մասը պատճառներով 'CB-open, timeout, 5xx, retry-exhausted։
p95/p99 լատենտ «մինչև» և «անջատիչից հետո»։
Կոլը/fallback-ի միջոցով հարցումների մասնաբաժինը։
Թրեյսինգը
Սպանների սենսացիաները ՝ «circuit = opened», «fallback = cache», «admission = denied»։
Հարաբերակցությունը սահմանների հետ (429/Rance Limit-), հերթերով և փամփուշտներով։
Լոգա/աուդիտ
Բացահայտման/փակման, շեմերի, կախվածության ցուցանիշների պատճառը։
8) Պայմանագրեր և արձանագրություններ
HTTP
Fail-fox: «503 Live Unavailable» -ը '«Retry-After» (կամ «429» լիմիտներում)։
Partial ente/stail: "200 '/" 206" մետատվական քայքայման հետ (օրինակ ՝ "X-Degraded: 108")։
Քեշի քաղաքական գործիչները ՝ «Cache-Corl: stale-if-error, stale-while-revalidate»։
gRPC
"UNAVAILABABABE", "DEADIM _ EEDED", "RED-ի սեմանտիկան հաճախորդի քաղաքականության վրա/2019։
Deadom/timeout-ը հարցման համատեքստում։ տարածումը ցանցից ներքև է։
Idempotenty
«Idempotency-Key» -ը POST վիրահատությունների համար, սահմանին։
9) Տիպային ստանդարտ (կեղծ)
pseudo onRequest(req):
if circuit. isOpen(dep):
return fallbackOrFail(req)
with timeout(T):
try:
resp = call(dep, req)
circuit. recordSuccess(dep, latency=resp. latency)
return resp except TimeoutError or 5xx as e:
circuit. recordFailure(dep)
if circuit. shouldOpen(dep):
circuit. open(dep, coolDown=adaptive())
return fallbackOrFail(req)
Half-Open փորձարկում
pseudo onTimer():
if circuit. state(dep) == OPEN and coolDownExpired():
circuit. toHalfOpen(dep)
onRequestHalfOpen(req):
if circuit. allowTrial (dep): # e.g. 1 try: call -> success => close catch: reopen with longer coolDown else:
return fallbackOrFail(req)
10) Շեմերի կարգավորում
Դիտարկման պատուհանը 'սայթաքող N վայրկյան/հարցումներ։
Սխալների շեմն 'պատուհանի 20-50 տոկոսը (կախված է միգրանտներից)։
Լատենտության շեմն 'p95 ռուբլիներ SLO (օրինակ 300-500 մզ); ավելցուկը հաշվարկվում է որպես CB-ի համար «սխալ»։
Հարմարվողական cool-down: 10s 3530s 3860s-ը կրկնվող աշխատանքի ժամանակ։
11) Փորձարկում և քաոս պրակտիկա
Chaos: Լատենտության/սխալների միգրացիան կախված է RF, drop-ի կոտրվածքից։
Game days 'անջատիչի «բացման» գործարկումը մարտական միջավայրում, fallback ստուգումը։
Canary 'միացրեք RF/դեգրադացիայի քաղաքականությունը նախ 1-5 տոկոսի համար։
SLO բյուջե 'թույլ տվեք փորձեր, մինչև որ սպառվի error-budget-ը։
12) Ինտեգրումը մուլտֆիլմի տենանտիզմի հետ
CB-ի վիճակը կարելի է պահել per-dependency per-tenae (աղմկոտ վարձողների համար) կամ գլոբալ 'կախված բեռից։
Fallback-տվյալները և քեշները սեգմենտացրեք «tenom _ id»։
Առաջնահերթությունները/քվոտաները 'համաձայն պլանների (VIP չպետք է տառապեն Starter-ի վարքագծից)։
13) Չեկ թուղթ մինչև վաճառելը
- Timauts և Dedlines միջով և։
- Retrai-ը սահմանափակված է, միայն գաղափարական վիրահատությունների համար, backoff + ջիթերի հետ։
- CB շեմի արժեքները հիմնավորված են բեռի թեստի տվյալներով։
- Fallback ճանապարհները գոյություն ունեն, արագ և անվտանգ։ Քաղաքականության քեշը որոշվում է։
- Bulkhead-մեկուսացում 'առանձին փամփուշտներ/հերթեր/լիմիտներ։
- Metriki/treiss/logs նշում են CB-ի քայքայումը և վիճակը։
- Կարդացեք պատասխանները (HTTP/gRPC) վերնագրերի/վերնագրերի օրինակներով։
- Քաոս սցենարները և game-days-ը պարբերաբար անցնում են. կա runbook։
14) Տիպիկ սխալներ
Թայմաուտներ չկան «մինչև համառությունը» և կասկադային անկումներ։
Միասնական գլոբալ CB-ը ընտրական (էնդպոյնտի/մեթոդի) փոխարեն լրացուցիչ հրաժարումներ են։
Բաց անջատիչը, առանց fallback-ի, բացատրում է «դատարկ» էկրանները դեգրադացված UX-ի փոխարեն։
Retrai առանց ջիտերի տրամադրվում են համաժամանակյա հարցումների փոթորիկներ։
Երկար cool-down կարճ ձախողումների ժամանակ կամ շատ կարճ կայուն պայմաններում '«ֆլիպ-ֆլոպը»։
Bulkhead-ի բացակայությունը ընդհանուր փամփուշտների սպառումն է և «head-of-blocking» -ը։
15) Ռազմավարության արագ ընտրություն
Բարձր կարևորության ընթերցումները ՝ CB + cash stach + hedging (տնտեսապես)։
Ձայնագրություններ/վճարումներ ՝ խիստ թայմաուտներ, առնվազն գետանցիներ, idempotency keys, «կեղտոտ» fallback բացակայություն։
Արտաքին API: CB ագրեսիվ շեմերով, հարմարվողական cool-down, խիստ throttling։
Միկրովեռները, որոնք ունեն իմպուլսային բեռ 'bulkheads, concurrency, VIP գերակայություն։
Եզրակացություն
Circuit Breaker-ը և կառավարվող դեգրադացիան ճարտարապետության «ապահովագրություն» են, նրանք քաոտիկ մերժումներ են փոխանցում կանխատեսելի վարքագծին։ Պարզ թայմաուտները, որոնք սահմանափակված են ջիթերի, մեկուսացված շուլերի հետ, մտածված fallback-telemetria-ը դարձնում են կայուն կախվածության ձախողումներ և պահպանում SLO-ն նույնիսկ գագաթնակետին և արտակարգ իրավիճակներում։