GH GambleHub

Timeout и 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`.
payments’POST’uchun misol (maqsad 400 ms):
  • 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.

3. Idempotent vs write:
  • 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;

Быстрый отказ при перегрузке 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 передается вниз

7. 4 HTTP-mijoz (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 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=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 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.

Contact

Biz bilan bog‘laning

Har qanday savol yoki yordam bo‘yicha bizga murojaat qiling.Doimo yordam berishga tayyormiz.

Integratsiyani boshlash

Email — majburiy. Telegram yoki WhatsApp — ixtiyoriy.

Ismingiz ixtiyoriy
Email ixtiyoriy
Mavzu ixtiyoriy
Xabar ixtiyoriy
Telegram ixtiyoriy
@
Agar Telegram qoldirilgan bo‘lsa — javob Email bilan birga o‘sha yerga ham yuboriladi.
WhatsApp ixtiyoriy
Format: mamlakat kodi va raqam (masalan, +998XXXXXXXX).

Yuborish orqali ma'lumotlaringiz qayta ishlanishiga rozilik bildirasiz.