GH GambleHub

Timeout и circuit control

1) Эмне үчүн керек

Системалар бир эле "өлүмгө алып келген" катачылыктан эмес, кечигүүлөрдүн жана "толкун" ретраларынын топтолушунан түшөт. Таймауттар күтүү убактысын чектейт жана ресурстарды коё берет, ал эми circuit control (breaker + shedding + адаптивдүү атаандаштык) көз карандылык чынжырына жайылып кетүүсүнө жол бербейт. Максат - p95/p99 максаттуу чектерде кармап туруу жана жарым-жартылай бузулганда жеткиликтүүлүгүн сактоо.


2) Негизги аныктамалар

2. 1 убакыт түрлөрү (L7/L4)

Connect timeout - TCP/TLS байланышын орнотуу.
TLS/Handshake timeout - кол алышуу TLS/HTTP2 preface.
Write timeout - суроо-талап жөнөтүү (анын ичинде орган).
Read timeout - жооп жана/же бүт дененин биринчи байт күтүү.
Idle/Keep-Alive timeout - активдүү эмес байланыш.
Overall deadline - бүткүл суроо-талап үчүн "катуу" мөөнөтү (end-to-end).

2. 2 Таймаут бюджети (deadline budget)

Максаттуу 'deadline _ total' деп белгилеп, төмөнкүлөргө бөлөбүз:
  • `ingress (gateway) + authZ + app + DB/cache + outbound PSP`.
Мисалы үчүн payments 'POST' (максаты 400 ms):
  • шлюз: 30 ms,
  • тиркеме: 120 мс,
  • БД: 120 мс,
  • PSP: 100 мс,
  • запасы: 30 ms.

2. 3 Пропаганда жана жокко чыгаруу

'deadline '/' timeout' чынжыр боюнча (контекст, аталыштар, gRPC Deadline) берилиши керек. Мөөнөтү аяктаганда - фон операцияларын жокко чыгаруу (abort/ctx cancel), блокторду/семафорлорду тазалоо.


3) Таймауттарды орнотуу стратегиялары

1. Жогорудан ылдый: SLO жана p95 негизинде - end-to-end deadline, андан кийин төмөнкү таймауттарга бөлүү.
2. "Кымбат" жолдорду аныктоо (файлды жүктөө, отчеттор, тышкы PSP) - өзүнчө узун, бирок чектелген.

3. Idempotent vs write:
  • idempotent (GET/статустун кайталанышы) - кыскасы, агрессивдүү;
  • write/акча - бир аз узун, бирок бир жолу кайталоо жана ыктымалдуулук менен.
  • 4. пландары/Тенанттар (Enterprise узун убакыт болушу мүмкүн, бирок аз параллелизм).


4) Circuit breaker: моделдер жана параметрлери

4. 1 Ишке киргизүү саясаты

Failure-rate: каталардын үлүшү ≥ X% N суроо/убакыт терезесинде.
Consecutive failures: M катары менен ийгиликсиз.

Slow-call rate: T. босогосунан узак чалуулардын үлүшү

Error classes: Таймауттар/5xx/connection-reset → "өлүмгө", 4xx - эске албайт.

4. 2 Шарттар

Closed - баарын өткөрүп, статистиканы топтойт.
Open - токтоосуз баш тартуу (ресурстарды үнөмдөйт, көз карандылыкты кысымга албайт).
Half-open - чакан "сыноо" (N суроо) үчүн "суу текшерүү".

4. 3 Пайдалуу толуктоолор

Bulkhead (Shpangouts): көз карандылык агымдарынын/байланыштардын көлмөсү, баары бир "соруп" эмес.
Adaptive concurrency: байкалган латенттүүлүк боюнча параллелизмди автоматтык чектөө (AIMD/Vegas окшош алгоритмдер).
Load Shedding: жергиликтүү ресурстар (кезек, CPU, GC-тыныгуу) жоктугунан эрте баш тартуу/бузулуу.


5) Өз ара аракеттенүү: таймауттар, ретрациялар, лимиттер

Биринчи deadline, андан кийин retra: ар бир кайталоо жалпы мөөнөт менен сыйышы керек.
Backoff + jitter үчүн кайталоо; урматтоо 'Retry-After' жана retry-budget.
Rate limiting: ачык breaker менен - бороон күчөтүү үчүн эмес, чектөөлөрдү азайтуу.
Idempotency: write-операцияларында милдеттүү ("үнсүз" таймауттарда дубль болбош үчүн).
Кайда retrait: жакшыраак четинде (кардар/шлюз), терең эмес.


6) Практикалык максаттуу маанилери

Коомдук окуу API: end-to-end '200-500 ms', read timeout '100-300 ms'.
Критикалык write (төлөмдөр): '300-800 ms' e2e; тышкы PSP ≤ '250-400 ms'.
Connect/TLS: '50-150 ms' (көбүрөөк - тармак/чечүү көйгөйү).
Idle: '30-90 с' (мобилдик кардарлар - батареяны үнөмдөө үчүн кыска).
Баалуулуктарды p95/p99 жана региондор боюнча тууралаңыз.


7) Конфиги жана мисалдар

7. 1 Envoy (cluster + route, псевдо)

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-psevdo)

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 Resilience4j (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 соода

Span: ingress → handler → DB/Redis → тышкы.
Атрибуттар: 'timeout _ ms _ target', 'circuit _ state', 'queue _ time _ ms'.
Exemplars: конкреттүү trace-id p99 чокуларын байлап.

8. 3 Алерталар

'p99 _ latency {critical}'> максаттары катары менен X мүнөт.
'timeout _ rate {dependency}' секирик түрүндө> Y%.
'open '/' fapping' breaker үчүн тез-тез өтүү.
жогорку CPU/GC менен 'shed _ requests _ total' өсүшү.


9) Adaptive Concurrency & Load Shedding

9. 1 Идея

Автоматташтыруу латенттүүлүк куйруктарынын өсүшү менен параллелизмди азайтат:
  • AIMD: акырындык менен көбөйтүү, кескин төмөндөтүү.
  • Vegas окшош: максаттуу кезек (queue time).
  • Token-based: ар бир суроо-талап "өрттөп" токен; токендер өлчөнгөн ылдамдык боюнча берилет.

9. 2 ишке ашыруу

Жергиликтүү семафор per-route; максаты - 'queue _ time' босогодон төмөн кармап туруу.
Глобалдык "сактагыч" (чектүү RPS/атаандаштык) шлюзда.
CPU/кошулмалардын жетишсиздиги менен - ​ ​ логика аткарылганга чейин эрте баш тартуу (429/503 с 'Retry-After').


10) тестирлөө жана башаламандык жагдайлар

Latency injection: жасалма көз каранды 50-300 ms кошуу.
Packet loss/dup/drop (tc/tbf, Toxiproxy).
Knob turning: байламталардын бассейндерин азайтуу, жүктү сатурацияга чейин жогорулатуу.
Kill/Degrade бир аймак/шард (жарым-жартылай жеткиликсиздик).
Текшерүү: "ийгиликсиз" Ретрай бороон-чапкын; breaker алдын ала ачылат; кезек өсүп жатабы?


11) Антипаттерндер

connect/TLS/per-stage майда-чүйдөсүнө чейин жок бир глобалдык "read timeout".
Жалпы мөөнөттүн жоктугу → ретрайлер SLO чегинен чыгып кетет.
Життерсиз жана retry-budget жок ретрайлер.
Idle-тайм жок "түбөлүк" байланыштар → дескрипторлордун агуусу.
Breaker 4xx өлүмгө ката деп эсептейт.
Жок жокко чыгаруу/аборт → арткы иш кардардын тайм кийин улантылат.
мобилдик/туруксуз тармактар ​ ​ үчүн өтө узун убакыт.


12) iGaming/каржы өзгөчөлүктөрү

Критикалык write (депозиттер/корутундулар): Idempotency-Key менен бир кыска кайталоо, андан кийин '202 Accepted' + polling ордуна чексиз күтүүлөр.
PSP/банкинг: провайдер/аймак боюнча өзүнчө саясат (кээ бирлери жайыраак).
Жоопкерчиликтүү төлөмдөр жана лимиттер: блокировкаларда/ревьюларда - тез '423/409', "илинип турган" операцияларды сунбаңыз.
Отчеттуулук/агрегациялар - асинхрондук (batch + статус-ресурс) ишке киргизүү.


13) Prod-даярдык чек тизмеси

  • Критикалык жолдор боюнча end-to-end deadline аныкталган (GET/POST).
  • Бюджет этаптарга бөлүнгөн; үгүт мөөнөтү киргизилген.
  • Connect connect/TLS/read/write/idle шлюз жана кардарлар боюнча убакыт.
  • failure-rate жана slow-call босоголору менен Circuit breaker; туура half-ачык логика.
  • көз каранды Bulkheads; per-route параллелизм чеги.
  • Ашыкча жүктөөдө бизнес-логиканы аткарганга чейин жүктөө.
  • Ретра менен бириктирүү: backoff + Jitler, retry-budget, урматтоо 'Retry-After'.
  • Idempotentity write, 'Idempotency-Key' жана окуялар үчүн outbox.
  • Metrics: timeout/slow-call/breaker абалы/queue time/атаандаштык.
  • Башаламандык-тесттер: Injection кечигүү/жоготуу/мүчүлүштүктөр, зоналардын бузулушу.
  • Кардарлар үчүн документтер: тайминг мисалдары, жооп коддору, кайталоо кеңештери.

14) TL; DR

Ар бир суроо-талапка катуу мөөнөт бериңиз, аны этаптарга бөлүңүз жана чынжырдан ылдый таратыңыз. circuit breaker + bulkheads + adaptive concurrency + load shedding аркылуу мүчүлүштүктөрдү башкаруу. Кайталоо - мөөнөт чегинде гана, життер жана бюджет менен; write - бир гана демократиялык. TimeOut/slow-call, breaker жана 'queue _ time' абалын өлчөө, дайыма башаламандык сыноолорду кууп.

Contact

Биз менен байланышыңыз

Кандай гана суроо же колдоо керек болбосун — бизге кайрылыңыз.Биз дайым жардам берүүгө даярбыз!

Интеграцияны баштоо

Email — милдеттүү. Telegram же WhatsApp — каалооңузга жараша.

Атыңыз милдеттүү эмес
Email милдеттүү эмес
Тема милдеттүү эмес
Билдирүү милдеттүү эмес
Telegram милдеттүү эмес
@
Эгер Telegram көрсөтсөңүз — Emailден тышкары ошол жактан да жооп беребиз.
WhatsApp милдеттүү эмес
Формат: өлкөнүн коду жана номер (мисалы, +996XXXXXXXXX).

Түшүрүү баскычын басуу менен сиз маалыматтарыңыздын иштетилишине макул болосуз.