Timeout va circuit control
1) Nima uchun bu zarur?
Tizimlar bitta «halokatli» nosozlikdan emas, balki kechikishlar va «to’lqin» retraylarining to’planishidan tushadi. Taymautlar kutish vaqtini cheklaydi va resurslarni bo’shatadi, circuit control (breaker + shedding + moslashuvchan raqobat) esa tanazzulning qaramlik zanjiri bo’ylab tarqalishiga yo’l qo’ymaydi. Maqsad - p95/p99 ni maqsadli chegaralarda saqlash va qisman rad etilganda foydalanish imkoniyatini saqlab qolishdir.
2) Bazaviy ta’riflar
2. 1 Taymaut turlari (L7/L4)
Connect timeout - TCP/TLS ulanishini oʻrnatish.
TLS/Handshake timeout - qo’l siqish TLS/HTTP2 preface.
Write timeout - so’rovni jo’natish (tanani ham qo’shib).
Read timeout - javobning birinchi baytini va/yoki butun tanani kutish.
Idle/Keep-Alive timeout - aktiv boʻlmagan aloqa.
Overall deadline - butun so’rov uchun «qattiq» muddat (end-to-end).
2. 2 Taymaut budjeti (deadline budget)
Maqsadli’deadline_total’ni tanlaymiz va quyidagi bosqichlarga bo’lamiz:- `ingress (gateway) + authZ + app + DB/cache + outbound PSP`.
- shlyuz: 30 ms,
- ilova: 120 ms,
- BD: 120 ms,
- PSP: 100 ms,
- zaxira: 30 ms.
2. 3 Propagation va bekor qilish
’deadline ’/’ timeout’ zanjir bo’ylab (kontekst, sarlavha, gRPC Deadline) uzatilishi kerak. Tugaganda - fon operatsiyalarini bekor qilish (abort/ctx cancel), blokirovkalar/semaforlarni tozalash.
3) Taymautlarni o’rnatish strategiyasi
1. Yuqoridan pastga: SLO va p95 asosida - end-to-end deadline qo’ying, so’ngra pastki taymautlarga bo’ling.
2. «Qimmat» yo’llarni identifikatsiya qilish (faylni yuklash, hisobotlar, tashqi PSP) - alohida uzoqroq, lekin cheklangan.
- idempotent (GET/maqomni takrorlash) - qisqaroq, tajovuzkor;
- write/pulli - biroz uzunroq, lekin bir marta qaytarish va idempotentlik bilan.
4. Reja/tenantlar boʻyicha darajalash (enterprise timeout uzunroq, ammo kamroq parallellikka ega boʻlishi mumkin).
4) Circuit breaker: modellar va parametrlar
4. 1 Ishga tushirish siyosati
Failure-rate: N soʻrovlar/vaqt oynasida xato ulushi ≥ X%.
Consecutive failures: M ketma-ket muvaffaqiyatsizliklar.
Slow-call rate: qoʻngʻiroqlar ulushi T. chegarasidan uzoqdir.
Error classes: taymautlar/5xx/connection-reset → «halokatli», 4xx - hisobga olinmaydi.
4. 2 Holatlar
Closed - hamma narsani o’tkazib yuboradi, statistikani to’playdi.
Open - bir zumda muvaffaqiyatsiz tugadi (resurslarni tejaydi, qaramlikni bosmaydi).
Half-open - «suvni tekshirish» uchun kichik «namunalar» (so’rovlar N).
4. 3 Foydali qo’shimchalar
Bulkhead (shpangoutlar): bogʻlanish uchun oqim/ulanish puli.
Adaptive concurrency: parallelizmni avtomatik ravishda cheklash (AIMD/Vegas kabi algoritmlar).
Load Shedding: lokal resurs (navbatlar, CPU, GC-pauzalar) yetishmaganda erta ishdan chiqish/tanazzul.
5) O’zaro hamkorlik: taymautlar, retralar, limitlar
Avval deadline, keyin retrajlar: har bir takrorlash umumiy muddatga mos kelishi kerak.
Backoff + jitter ’Retry-After’ va retry-budgetni hurmat qilish.
Rate limiting: ochiq breaker - bo’ronni kuchaytirmaslik uchun chegaralarni pasaytiring.
Idempotency: write-operatsiyalarda majburiy («ovozsiz» taymautlarda dubllarni oldini olish uchun).
Qayerda retraj qilish kerak: ichkarida emas, balki chetida (mijoz/shlyuz).
6) Amaliy maqsadli qiymatlar (mo’ljallar)
Ommaviy o’qish API: end-to-end’200-500 ms’, read timeout’100-300 ms’.
Tanqidiy write (to’lovlar):’300-800 ms’e2e; tashqi PSP ≤’250-400 ms’.
Connect/TLS:’50-150 ms’(koʻproq - tarmoq/hal qilish muammosi).
Idle:’30-90 s’(mobil mijozlar batareyani tejash uchun qisqaroq).
Qiymatlarni p95/p99 va mintaqalar boʻyicha oʻzgartiring.
7) Konfigi va misollar
7. 1 Envoy (cluster + route, psevdo)
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 (perimetr)
nginx proxy_connect_timeout 100ms;
proxy_send_timeout 200ms; # write proxy_read_timeout 300ms; # read
keepalive_timeout 30s;
send_timeout 15s;
Fast overload failure limit_conn_zone $ binary_remote_addr zone = addr: 10m;
limit_conn addr 50;
7. 3 gRPC (mijoz, Go-psevdo)
go ctx, cancel:= context. WithTimeout(context. Background(), 350time. Millisecond)
defer cancel()
resp, err:= client. Pay (ctx, req )//Deadline is passed down
7. 4 HTTP-mijoz (Go)
go client:= &http. Client{
Timeout: 350 time. Millisecond ,//total deadline for inquiry
Transport: &http. Transport{
TLSHandshakeTimeout: 100 time. Millisecond,
ResponseHeaderTimeout: 250 time. Millisecond,
IdleConnTimeout: 30 time. Second,
MaxIdleConnsPerHost: 100,
},
}
7. 5 Resilience4j (Java, psevdo)
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) Kuzatish va alertinglar
8. 1 Metrika
`http_client_requests{endpoint, status}`, `client_latency_bucket`
`timeouts_total{stage=connect|read|write|deadline}`
`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 Treyslar
Spanlar: ingress → handler → DB/Redis → tashqi.
’timeout_ms_target’,’circuit_state’,’queue_time_ms’atributlari.
Exemplar: p99 choʻqqilarini aniq trace-id ga bogʻlash.
8. 3 Alertlar
’p99_latency {critical}’> maqsadlar ketma-ket X daqiqa.
’timeout_rate {dependency}’ sakrash tarzida> Y%.
’open ’/’ flapping’ breakerga tez-tez oʻtish.
Yuqori CPU/GC bilan’shed_requests_total’oʻsishi.
9) Adaptive Concurrency & Load Shedding
9. 1 G’oya
Avtomatika latentlik dumlari o’sganda parallellikni kamaytiradi:- AIMD: sekin kattalashtirish, keskin pasaytirish.
- Vegas kabi: maqsadli navbat (queue time).
- Token-based: har bir so’rov tokenni «yoqadi»; tokenlar o’lchangan tezlik bo’yicha beriladi.
9. 2 Sotish
Lokal semaforlar per-route; maqsad’queue_time’ni ostonadan ushlab turishdir.
Shlyuzda global «himoya» (cheklangan RPS/raqobatbardoshlik).
CPU/ulanishlar yetishmaganda - mantiqni bajarishdan oldin erta rad etish (429/503 s’Retry-After’).
10) Test va xaos-stsenariylar
Latency injection: giyohvandlikka sun’iy 50-300 ms qo’shish.
Packet loss/dup/drop (tc/tbf, Toxiproxy).
Knob turning: ulanish pullarini kamaytirish, yukni saturatsiyagacha oshirish.
Kill/Degrade bitta zona/shard (qisman mavjud emas).
Tekshirishlar: retray-bo’ron «barbod bo’lmayaptimi»; breaker oldindan aytib bo’lmaydigan tarzda ochiladi; navbat ortib boryaptimi?
11) Antipatternlar
Bitta global «read timeout» detalsiz connect/TLS/per-bosqich.
Umumiy muddat yo’qligi → retralar SLO doirasidan tashqarida.
Jittersiz va retry-budgetsiz retraylar.
Idle-taymautsiz «abadiy» ulanishlar → deskriptorlar oqishi.
Breaker 4xx ni halokatli xatolar deb biladi.
Bekor qilish/abort → orqa fon ishlari mijoz taymautidan keyin davom etadi.
Mobil/beqaror tarmoqlar uchun vaqt juda uzoq.
12) iGaming/Moliya xususiyatlari
Tanqidiy write (depozitlar/xulosalar): Idempotency-Key bilan bitta qisqa takrorlash, so’ngra cheksiz kutish o’rniga’202 Accepted’+ polling.
PSP/banking: provayder/mintaqa bo’yicha alohida siyosat (ba’zilari sekinroq).
Mas’ul to’lovlar va limitlar: blokirovkalarda/revyularda - tezkor’423/409’, «osilgan» operatsiyalarni cho’zmaslik.
Hisobot/agregatsiyalar - asinxron (batch + status-resurs) ishga tushirish.
13) Prod-tayyorlik chek-varaqasi
- Kritik yo’nalishlar bo’yicha end-to-end deadline aniqlandi (GET/POST).
- Budjet bosqichlarga bo’lingan; propagation muddati yoqilgan.
- Konfigi connect/TLS/read/write/idle taymautlar shlyuzda va mijozlarda.
- Failure-rate va slow-call ostonali Circuit breaker; toʻgʻri half-open mantiq.
- Bulkheads qaramlikda; per-route parallellik limitlari.
- Ortiqcha yuklashda biznes mantiqini bajarishdan oldin yuklash.
- Retralar bilan integratsiya: backoff + jitter, retry-budget, hurmat’Retry-After’.
- Hodisa uchun write,’Idempotency-Key’va outbox idempotentligi.
- Metrika: timeout/slow-call/breaker/queue time/raqobatbardoshlik holati.
- Xaos-testlar: kechikish/yo’qotish/nosozliklarni in’ektsiya qilish, zonalarning degradatsiyasi.
- Mijozlar uchun hujjatlar: tayming misollari, javob kodlari, takrorlash bo’yicha maslahatlar.
14) TL; DR
Har bir so’rovga qat’iy muddat bering, uni bosqichlarga bo’ling va zanjir bo’ylab tarqating. Muvaffaqiyatsizliklarni circuit breaker + bulkheads + adaptive concurrency + load shedding orqali boshqaring. Takrorlash - faqat muddat doirasida, jitter va budjet bilan; write - faqat idempotent. Timeout/slow-call, breaker va’queue_time’holatini o’lchang, muntazam ravishda tartibsizlik testlarini o’tkazing.