GH GambleHub

Devre kontrolü и zaman aşımı

1) Neden ihtiyacınız var

Sistemler tek bir "ölümcül" arızadan değil, gecikmelerin ve "dalga" geri dönüşlerinin birikmesinden düşer. Zaman aşımları bekleme süresini sınırlar ve kaynakları boşaltır ve devre kontrolü (kırıcı + dökülme + uyarlanabilir rekabet) bozulmanın bağımlılık zinciri boyunca yayılmasını önler. Amaç, p95/p99'u hedef sınırlar içinde tutmak ve kısmi arızalar için kullanılabilirliği korumaktır.


2) Temel tanımlar

2. 1 Zaman aşımı türleri (L7/L4)

Bağlantı zaman aşımı - Bir TCP/TLS bağlantısı kurun.
TLS/El sıkışma zaman aşımı - el sıkışma TLS/HTTP2 önsöz.
Zaman aşımı yaz - bir istek gönder (gövde dahil).
Okuma zaman aşımı - yanıtın ilk baytını ve/veya tüm gövdeyi bekleyin.
Idle/Keep-Alive zaman aşımı - etkin olmayan bağlantı.
Genel son tarih - tüm istek için "zor" son tarih (uçtan uca).

2. 2 Son tarih bütçesi

'Deadline _ total' hedefini seçin ve aşamalara bölün:
  • 'giriş (ağ geçidi) + authZ + uygulama + DB/önbellek + giden PSP'.
'POST' ödemeleri için örnek (400 ms hedefi):
  • Ağ geçidi: 30 ms,
  • Uygulama: 120 ms,
  • DB: 120 ms,
  • PSP: 100 ms,
  • Marj: 30 ms.

2. 3 Yayılma ve iptal

'deadline'/' timeout', zincirden (bağlam, başlıklar, gRPC Deadline) geçirilmelidir. Son kullanma tarihinde - arka plan işlemlerini iptal et (iptal et/ctx iptal et), kilitleri/semaforları temizle.


3) Zaman aşımı belirleme stratejileri

1. Yukarıdan aşağıya: SLO ve p95'e göre - uçtan uca son tarih ayarlayın, ardından alt zaman aşımlarına bölünür.
2. "Pahalı" yolları tanımlayın (dosya indirmeleri, raporlar, harici PSP'ler) - bireysel daha uzun, ancak sınırlı.

3. Idempotent vs yazmak:
  • Idempotent (GET/durum tekrarları) - daha kısa, daha agresif;
  • yazma/parasal - biraz daha uzun, ancak tek bir tekrarlama ve idempotency ile.
  • 4. Planlar/kiracılar tarafından mezuniyet (işletme daha uzun zaman aşımına sahip olabilir, ancak daha az paralellik olabilir).


4) Devre kesici: modeller ve parametreler

4. 1 Tetikleyici politikalar

Yavaş arama oranı - eşik T'den daha uzun aramaların oranı

Hata oranı - sorgu/zaman N penceresinde hata oranı ≥ X %.
Sonuç başarısızlıkları: M ardışık başarısızlıkları.
Hata sınıfları: zaman aşımları/5xx/bağlantı sıfırlama - "ölümcül", 4xx - dikkate almayın.

4. 2 Koşullar

Kapalı - her şeyi atlar, istatistik biriktirir.
Açık - anında başarısızlık (kaynak tasarrufu sağlar, bağımlılığı ezmez).
Yarı açık -'su testi "için küçük" örnekler "(N istekleri).

4. 3 Faydalı eklemeler

Bulkhead: Bağımlılık başına bir iş parçacığı/bağlantı havuzu, böylece kişi her şeyi "emmez".
Uyarlanabilir eşzamanlılık: Gözlemlenen gecikme ile otomatik eşzamanlılık kısıtlaması (AIMD/Vegas benzeri algoritmalar).
Yük Boşaltma: Yerel kaynak eksikliği durumunda erken arıza/bozulma (kuyruklar, CPU, GC duraklamaları).


5) Etkileşim: zaman aşımları, geri çekilmeler, sınırlar

İlk son tarih, sonra geri ödeme: her tekrarlama ortak bir son tarihe uymalıdır.
Backoff + tekrarları için jitter; Respect 'Retry-After've retry-budget.
Hız sınırlaması: Kırıcı açık - fırtınayı yoğunlaştırmamak için daha düşük sınırlar.
Idempotency: yazma işlemlerinde zorunludur ("aptal" zaman aşımları ile alımları önlemek için).
Nerede geri çekilecek: tercihen derinlerde değil, sınırda (istemci/ağ geçidi).


6) Pratik hedef değerler (kriterler)

Genel okuma API'si: uçtan uca '200-500 ms', okuma zaman aşımı '100-300 ms'.
Kritik yazma (ödemeler): '300-800 ms' e2e; Harici PSP ≤ '250-400 ms'.
Connect/TLS: '50-150 ms' (daha fazla - ağ/lehimleme sorunu).
Boşta: '30-90 s' (mobil istemciler - pil tasarrufu için daha kısa).
P95/p99 ve bölgeler için değerleri ayarlayın.


7) Yapılandırmalar ve örnekler

7. 1 Elçi (küme + rota, sözde)

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 (çevre)

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 (istemci, Go-pseudo)

go ctx, cancel:= context.WithTimeout(context.Background(), 350time.Millisecond)
defer cancel()
resp, err:= client.Pay(ctx, req) // Deadline передается вниз

7. 4 HTTP istemcisi (Git)

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, pseudo)

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) Gözlemlenebilirlik ve uyarı

8. 1 Metrikler

'http _ client _ requests {uç nokta, durum}', 'client _ latency _ bucket'

'timeouts _ total {stage = connectOkuYazson tarih} '
'circuit _ state {dependency}': 0/1/2 (kapalı/yarım/açık)
'slow _ call _ rate', 'failure _ rate'
'active _ concurrency {route, dependency}'
'shed _ requests _ total {reason}' (yük boşaltma)
'retry _ total {reason}', 'retry _ budget _ used'

8. 2 Trails

Yayılma Alanları: giriş ^ işleyici ^ DB/Redis ^ external.
Nitelikler: 'timeout _ ms _ target', 'circuit _ state', 'queue _ time _ ms'.
Örnekler: P99 zirvelerini belirli trace-id'e bağlayın.

8. 3 Uyarılar

'p99 _ latency {critical}'> üst üste X dakikalarını hedefler.
'timeout _ rate {dependency}' hopped> Y %.
Sık sık 'open'/' flapping' kesicisine geçişler.
Yüksek CPU/GC ile 'shed _ requests _ total' büyümesi.


9) Uyarlanabilir Eşzamanlılık ve Yük Dökümü

9. 1 Fikir

Gecikme kuyrukları büyüdükçe otomasyon paralelliği azaltır:
  • AIMD: yavaş artış, keskin düşüş.
  • Vegas benzeri: sıra zamanını koru.
  • Belirteç tabanlı: her istek belirteci "yakar"; Jetonlar ölçülen hıza göre verilir.

9. 2 Uygulama

Rota başına yerel semaforlar; Amaç, 'queue _ time' değerini eşiğin altında tutmaktır.
Ağ geçidinde küresel "sigorta" (marjinal RPS/rekabetçi).
CPU/bağlantı sıkıntısı varsa, mantık yürütülmeden önce erken başarısızlık (429/503 'Retry-After'ile).


10) Test ve kaos senaryoları

Gecikme enjeksiyonu: bağımlılık başına yapay olarak 50-300 ms ekleyin.
Paket kaybı/dup/drop (tc/tbf, Toxiproxy).
Topuz tornalama: bağlantı havuzlarını azaltın, yükü doygunluğa yükseltin.
Kill/Degrade bir bölge/parça (kısmi kullanılamaması).
Kontroller: retray fırtınasını "başarısız" etmez; kırıcı öngörülebilir şekilde açılır; Kuyruğun büyüyüp büyümediği.


11) Antipatterns

Bir global "okuma zaman aşımı" ayrıntı bağlantısı olmadan/TLS/sahne başına.
Ortak bir son teslim tarihinin olmaması - retrays SLO'nun ötesine geçer.
Titremesiz ve yeniden deneme bütçesiz Retrai.
Boşta kalma süreleri olmayan "sonsuz" bağlantılar - sızıntı tanımlayıcıları.
Breaker, 4xx'i ölümcül hata olarak sayar.
Geri alma/iptal etme yok - istemci zaman aşımından sonra arka plan çalışması devam eder.
Zaman aşımları mobil/kararsız ağlar için çok uzun.


12) iGaming/Finansın Özellikleri

Kritik yazma (para yatırma/çıktılar): Idempotency-Key ile kısa bir tekrar, sonra sonsuz beklentiler yerine '202 Kabul Edildi' + yoklama.
PSP/bankacılık: sağlayıcı/bölgeye göre ayrı politikalar (biraz daha yavaş).
Sorumlu ödemeler ve limitler: kilitler/incelemeler için - hızlı '423/409', "asılı" işlemleri uzatmayın.
Raporlama/toplama - eşzamansız olarak çalıştırın (toplu iş + durum kaynağı).


13) Prod Hazırlık Kontrol Listesi

  • Uçtan uca kritik rota son tarihi (GET/POST) tanımlanmıştır.
  • Aşamaya göre bütçelenen; Son tarih yayılımı etkinleştirildi.
  • Ağ geçidi ve istemcilerde Connect/TLS/read/write/idil yapılandırmaları.
  • Arıza oranı ve yavaş çağrı eşikleri ile devre kesici; doğru yarı açık mantık.
  • Bağımlılıklara ilişkin bulkheads; Rota başına eşzamanlılık sınırları.
  • Aşırı yükleme sırasında iş mantığı yürütülmeden önce yük atma.
  • Geri çekilmelerle entegrasyon: backoff + jitter, retry-budget, 'Retry-After'a saygı.
  • Idempotency yazmak, 'Idempotency-Key've olaylar için giden kutusu.
  • Metrikler: zaman aşımı/yavaş çağrı/kırıcı/kuyruk zamanı/rekabetçi.
  • Kaos testleri: Gecikmeler/kayıplar/arızalar enjeksiyon, bölgelerin bozulması.
  • Müşteri belgeleri: örnek zamanlamalar, yanıt kodları, tekrar oynatma ipuçları.

14) TL; DR

Her talebe zor bir son tarih verin, aşamalar halinde düzenleyin ve zincir boyunca yayın. Devre kesici + bölmeler + uyarlanabilir eşzamanlılık + yük atma yoluyla hataları yönetin. Tekrarlar - sadece son tarih içinde, jitter ve bütçe ile; yaz - sadece idempotent. Measure timeout/slow-call, breaker state ve 'queue _ time', düzenli olarak kaos testleri uygulayın.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.