Dış servis düştüğünde
Timeout, retry ve circuit breaker: yavaş bir dış servisin tüm uygulamayı kilitlemesini üç savunma hattıyla nasıl durdurursun.
Çökmedi, yavaşladı
Bir SMS sağlayıcısı yavaşladı. Bütün uygulama durdu.
Yanıt süresi 30 saniyeye çıktı; yarım saat içinde SMS ile hiç ilgisi olmayan endpoint'ler bile zaman aşımına uğruyordu.
Cascading failure
Yavaşlık nasıl yayılır
- Adım 1: Process kilitlenir
worker / PHP-FPM process bağlı - Adım 2: Süre kaybolur
30 sn çağrı = 30 sn meşgul - Adım 3: Havuz dolar
yeni istekler sırada bekler - Adım 4: Sağlıklılar ölür
ilgisiz endpoint'ler timeout
5 sn
Birinci savunma: timeout
toplam timeout
Varsayılan 30 saniye değil, 5: Http::timeout(5)->connectTimeout(2). Değerler kaynağın önerdiği örnektir; bu sayı bir karar olmalı.
İkinci savunma: sınırlı retry
Üç deneme, iki bekleme
bekleme, ms
- 1. bekleme200
- 2. bekleme400
~3,4 dk
Backoff'a tavan koy
cap olmadan 12. bekleme
delay = min(cap, base × factorⁿ⁻¹). Cap olmadan base 100 ms × 2, 12. denemede yaklaşık 3,4 dakikaya ulaşır.
Thundering herd
Jitter türleri
| Tür | Aralık | Davranış |
|---|---|---|
| Full | [0, delay] | En geniş dağılım; bir istemci çok erken deneyebilir |
| Equal | [delay/2, delay] | Bir taban tutar, yine de herd'i dağıtır |
| Decorrelated | [base, önceki × 3] | Capped; son beklemeye uyar, güçlü varsayılan |
| None | jitter yok | Tek istemci için sorun değil, bir filo için tehlikeli |
Üçüncü savunma: circuit breaker
Çağrı yapmayı bırakmak
5 saniyelik timeout bile process başına 5 saniyedir; open durumda bu süre 0'a iner.
Fail-fast
- 01Closedçağrılar geçer, hatalar sayılır
- 02Opendış servise gidilmez, anında hata
- 03Half-opentek deneme: başarılıysa closed
Fail-fast, yavaş-fail'den iyidir
Devre açıkken ne yaparsın
- Kuyruğa alSMS hemen gitmek zorunda değilse devre kapanınca işlenmek üzere bırak.
- Bayat veriyi sunDöviz kuru servisi çöktüyse son bilinen kuru göster.
- Zarifçe kıs"Öneriler şu an yüklenemiyor" demek, sayfayı çökertmekten iyidir.