GH GambleHub

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`

`timeouts_total{stage=connectreadwritedeadline}`
`circuit_state{dependency}`: 0/1/2 (closed/half/open)
`slow_call_rate`, `failure_rate`
`active_concurrency{route, dependency}`
`shed_requests_total{reason}` (load shedding)
`retry_total{reason}`, `retry_budget_used`

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» վիճակը, պարբերաբար հետապնդեք քաոս թեստերը։

Contact

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

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

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

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

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

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