Timeout и circuit control
1) Ինչո՞ ւ է դա անհրաժեշտ
Համակարգերը ընկնում են ոչ թե մեկ «ֆատալ» ձախողումից, այլ ուշացումների կուտակումից և «ալիքի» գետերից։ Թայմաուտները սահմանափակում են սպասման ժամանակը և ազատում ռեսուրսները, իսկ circuit control (breaker + shedding + հարմարվողական մրցակցություն) չի տալիս քայքայվել կախվածության շղթայով։ Նպատակը 'պահել p95/p99 ռուսական սահմաններում և պահպանել հասանելիությունը մասնակի ծածկոցներով։
2) Հիմնական սահմանումները
2. 1 Timauts (L7/L4)
Connational timeout-ը TCP/TSA միացությունների տեղադրումն է։
TFC/Handshake timeout-ը TFC/HTTP2 ww.face ձեռքն է։
Write timeout-ը հարցման ուղարկումն է (ներառյալ մարմինը)։
Read timeout-ը առաջին պատասխանը և/կամ ամբողջ մարմնի սպասումն է։
Idle/Keep-Alive timeout-ը հիբրիդային միացություն է։
Overall deadics-ը «կոշտ» ժամանակահատվածն է ամբողջ հարցման համար (end-to-end)։
2. 2 Թայմաուտի բյուջե (deadom budget)
Մենք առանձնացնում ենք www.deadme _ total "և կիսում քայլերով
`ingress (gateway) + authZ + app + DB/cache + outbound PSP`.
Օրինակ payments 'POST' (նպատակը 400 մզ)։
դարպասը ՝ 30 մզ,
հավելված ՝ 120 մզ,
ԲԴ ՝ 120 մզ,
PSA: 100 մզ,
պահուստը 30 մզ է։
2. 3 Propagation և վերացում
«deadom »/« timeout» -ը պետք է փոխանցվի շղթայի միջով (ենթատեքստը, վերնագրերը, gRPC Deadium)։ Ֆիլտրում 'ֆոնային վիրահատությունների վերացումը (ab.ru/ctx cancel), արգելափակման/սեմաֆորների մաքրումը։
3) Թայմաուտների տեղադրման ռազմավարությունը
1. Վերևից ներքև 'հիմնվելով SLO-ի և p95-ի վրա' տալ end-to-end deadium, ապա կոտրել թայմաուտները։
2. Բացահայտել «թանկ» ճանապարհները (ֆայլի, հաշվետվությունների, արտաքին PSA) - առանձին ավելի երկար, բայց սահմանափակ։
3. Idempotent vs write:- idempotent (GET/կարգավիճակի կրկնություններ) - ավելի կարճ, ավելի ագրեսիվ;
- write/դրամական 'մի փոքր ավելի երկար, բայց մեկ անգամ կրկնօրինակելով և հակադրությամբ։
4. Պլաններ/տենանտներ (enterprise կարող է ունենալ ավելի երկար, քան timeout, բայց ավելի քիչ զուգահեռ)։
4) Circuit breaker 'մոդելներ և պարամետրեր
4. 1 Գործարկման քաղաքականություն
Failure-rate: Սխալների մասնաբաժինը X% է N/ժամանակի պատուհանում։
Consecutive failures: M անընդմեջ ձախողումներ։
Slow-call rate: զանգերի մասը ավելի երկար է, քան T.
Error classes: Timauts/5xx/connational-reset no «fatal», 4xx-ը հաշվի չեն առնում։
4. 2 Վիճակ
Closed-ը բաց է թողնում ամեն ինչ, կուտակում վիճակագրությունը։
Բաց 'ակնթարթային հրաժարումը (խնայում է ռեսուրսները, չի տալիս կախվածությունը)։
Half-open-ը փոքրիկ «թեստեր» է (N հարցումներ) «ջրի ստուգման» համար։
4. 3 Օգտակար ավելացումներ
Bulkhead (սպանգոուտներ) 'հոսքերի/կախվածության փամփուշտ, որպեսզի մեկը «բարձրացնի» ամեն ինչ։
Adaptive concurrency: Ավտոմատ սահմանափակումը (AIMD/Vegas նման ալգորիթմներ) դիտարկված լատենտության վրա։
Load Shedding: վաղ հրաժարումը/քայքայումը ռուսական ռեսուրսի պակասի դեպքում (հերթեր, CPU, GC դադարներ)։
5) Փոխազդեցություն ՝ թայմաուտներ, ռեթրաններ, լիմիտներ
Սկզբում deadom, ապա retray: Յուրաքանչյուր խոհարար պետք է տեղավորվի ընդհանուր dedline-ում։
Backoff + jitter խոհարարների համար; հարգել 'Retry-After' և retry-budget։
Rate limiting: բաց breaker-ի դեպքում նվազեցրեք սահմանները, որպեսզի չաճի փոթորիկը։
Idempotency: Պարտադիր է write վիրահատությունների վրա («net» timautes)։
Որտե՞ ղ կարելի է ասել, որ այն գտնվում է եզրին (հաճախորդ/դարպաս), այլ ոչ թե ներսում խորքում։
6) Գործնական արժեքներ (արժեքներ)
Հանրային read API: end-to-end '200-500 ms «, read timeout' 100-300 ms»։
Քննադատական write (վճարումներ) '"300-800 ms' e2e; Արտաքին PSA-ն մեջբերում է «250-400 ms»։
Connational/TSA: «50-150 մզ» (ավելի շատ ցանցային/ռեշոլվինգի խնդիր)։
Idle: «30-90 s» (բջջային հաճախորդները ավելի կարճ են մարտկոցը խնայելու համար)։
Արժեքները ուղղեք p95/p99 և տարածաշրջաններով։
7) Գեորգի և օրինակներ
7. 1 Envoy (cluster + rome, կեղծ)
yaml clusters:
- name: payments_psp connect_timeout: 100ms type: STRICT_DNS lb_policy: ROUND_ROBIN circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 2000 max_requests: 2000 max_retries: 50 outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s max_ejection_percent: 50
routes:
- match: { prefix: "/api/v1/payments" }
route:
cluster: payments_psp timeout: 350ms # per-request deadline idle_timeout: 30s retry_policy:
retry_on: "reset,connect-failure,refused-stream,5xx,gateways"
num_retries: 1 per_try_timeout: 200ms
7. 2 NGINX (պարիմետրը)
nginx proxy_connect_timeout 100ms;
proxy_send_timeout 200ms; # write proxy_read_timeout 300ms; # read (первый байт/все тело)
keepalive_timeout 30s;
send_timeout 15s;
Быстрый отказ при перегрузке limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 50;
7. 3 GRPC (հաճախորդ, Go-կեղծ)
go ctx, cancel:= context.WithTimeout(context.Background(), 350time.Millisecond)
defer cancel()
resp, err:= client.Pay(ctx, req) // Deadline передается вниз
7. 4 HTTP հաճախորդ (Go)
go client:= &http.Client{
Timeout: 350 time.Millisecond, // общий дедлайн на запрос
Transport: &http.Transport{
TLSHandshakeTimeout: 100 time.Millisecond,
ResponseHeaderTimeout: 250 time.Millisecond,
IdleConnTimeout: 30 time.Second,
MaxIdleConnsPerHost: 100,
},
}
7. 5 Resilience4.ru (Java, կեղծ)
yaml resilience4j.circuitbreaker.instances.psp:
slidingWindowType: TIME_BASED slidingWindowSize: 60 failureRateThreshold: 50 slowCallDurationThreshold: 200ms slowCallRateThreshold: 30 permittedNumberOfCallsInHalfOpenState: 5 waitDurationInOpenState: 30s
resilience4j.timelimiter.instances.psp:
timeoutDuration: 350ms
8) Դիտողությունն ու ալերտինգները
8. 1 Մետրիկա
`http_client_requests{endpoint, status}`, `client_latency_bucket`
8. 2 Treiss
Spans: ingress no handler no DB/Redis-ը արտաքին է։
Ատրիբուտներ ՝ «timeout _ բանաձև _ target», «circuit _ state», «queue _ time»։
Էկզեմպլարները 'կապել պիկի p99-ը www.trace-id-ի հետ։
8. 3 Ալերտներ
"p99 _ latency _ critical _> X րոպեի նպատակները անընդմեջ։
«Timeout _ rate» dependency + - ը ցատկում է> Y%։
Հաճախակի անցումներ «բաց »/« flapping» breaker։
«Shed _ reques.ru _ total» աճը բարձր CPU/GC-ով։
9) Adaptive Concurrency & Load Shedding
9. 1 Գաղափար
Ավտոմատիկան նվազեցնում է զուգահեռականությունը լատենտային պոչերի աճի ժամանակ
AIMD 'դանդաղ ավելացնել, կտրուկ կրճատել։
Վեգասը նման է 'պահել նպատակային հերթը (queue time)։
Token-based: Յուրաքանչյուր հարցում «այրում» է։ հոսանքները արտադրվում են չափված արագությամբ։
9. 2 Lenta.ru
Տեղական սեմաֆորներ per-rope; նպատակն է պահել «queue _ time» շեմից ցածր։
Համաշխարհային «ապահովիչը» (նվիրված RPS/մրցակցություն) դարպասի վրա։
CPU/2019-ի պակասի դեպքում վաղ հրաժարվելը մինչև տրամաբանության կատարումը (429/503 s 'Retry-After ")։
10) Փորձարկումներ և քաոս սցենարներ
Latency inject: արհեստականորեն ավելացնել 50-300 մզ կախվածության համար։
Packet loss/dup/drop (tc/tbf, Toxiproxy).
Knob turning: կրճատել փամփուշտները, բարձրացնել բեռը մինչև saturation։
Kill/Degrade մեկ գոտի/շարդ (մասնակի անհասանելիություն)։
Ստուգումներ ՝ ոչ թե «ձախողվում» է ռետրո փոթորիկը։ breaker բացվում է կանխատեսելի; արդյո՞ ք հերթը չի աճում։
11) Անտիպատերնի
Մեկ գլոբալ «read timeout» առանց connational/TSA/2019 փուլերի։
Ընդհանուր dedline-ի բացակայությունը դուրս է գալիս SLO-ի սահմաններից։
Retrai առանց ջիթերի և առանց retry-budget։
«Հավիտենական» միացությունները առանց idle-timauts-ի, ցույց են տալիս, որ կրկնօրինակիչները արտահոսում են։
Breaker-ը համարում է 4xx-ը որպես ֆատալ սխալներ։
Ոչ պաշտոնական/ab.ru-ի ֆոնային աշխատանքները շարունակվում են հաճախորդի թայմաուտից հետո։
Շատ երկար թայմաուտներ բջջային/անկայուն ցանցերի համար։
12) iGaming/ֆինանսական առանձնահատկությունները
Քննադատական write (դեպոզիտներ/եզրակացություններ), մի կարճ խոհարար Idempotency-Key-ի հետ, ապա 'www.Accepted '+ poling' անվերջ սպասումների փոխարեն։
PMS/բանկինգ 'պրովայդերի/տարածաշրջանի առանձին քաղաքականություններ (որոշ ավելի դանդաղ)։
Պատասխանատու վճարումները և լիմիթները 'արգելափակման/ռևիի ժամանակ' արագ «423/409», մի ձգեք «կախված» վիրահատությունները։
Հաշվետվություններ/ագրեգացիաներ - սկսել ասինխրոն (batch + կարգավիճակ-ռեսուրս)։
13) Չեկ-թուղթ պատրաստակամության համար
- Delend-to-end dead.ru կրիտիկական ճանապարհներով (GET/POST)։
- Հոտերի բյուջեն քայքայված է. ներառում է progation dedline։
- Wings connations/TMS/read/write/idle timaute և հաճախորդների վրա։
- Circuit breaker շեմերով failure-rate և slow-call; ճիշտ half-բաց տրամաբանություն։
- Bulkheads կախվածության վրա; per-rope զուգահեռականության սահմանները։
- Load shedding մինչև բիզնեսի տրամաբանությունը ծանրաբեռնելիս։
- Ինտեգրումը հետքերի հետ 'backoff + jitter, retry-budget, հարգանք «Retry-After»։
- Idempotenty write, «Idempotency-Key» և www.box իրադարձությունների համար։
- Metriki: timeout/slow-call/վիճակը breaker/queue Time/մրցակցություն։
- Քաոս-թեստեր 'հետաձգումների միգրացիա/105/ձախողումներ, գոտիների քայքայումը։
- Հաճախորդների համար 'թայմինգների օրինակներ, պատասխաններ, խոհարարների խորհուրդներ։
14) TL; DR
Թույլ տվեք, որ յուրաքանչյուր խնդրանքով կոշտ դադար լինի, տեղադրեք այն քայլերի միջով և տարածեք ներքև։ Կառավարեք circuit breaker + bulkheads + adaptive concurrency + load sheding։ Կրկնությունները միայն Dedline-ի շրջանակներում են, ջիթերի և բյուջեի հետ։ write-ը միայն idempotent է։ Չափեք timeout/slow-call, breaker և «queue _ time» վիճակը, պարբերաբար հետապնդեք քաոս թեստերը։