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'.
- 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ı.
- 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'
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.