Exponential Backoff
- Okunuşu
- ekspınenşıl bekof
Kısaca
Exponential backoff, her başarısız denemeden sonra 1, 2, 4, 8 saniye gibi giderek daha uzun bekleyen yeniden deneme stratejisidir; zorlanan servis toparlanır.
Exponential backoff nedir?
Bir ağ çağrısı başarısız olduğunda sıkı bir döngüde hemen yeniden denemek genellikle işleri kötüleştirir: sunucu aşırı yüklüyse ani yeniden denemeler yalnızca daha fazla yük ekler. Exponential backoff, her başarısızlıktan sonra bekleme süresini, tipik olarak iki katına çıkararak çarpar ve yeniden denemeleri aralıklandırır. Bir istemci 1 saniye, sonra 2, sonra 4, sonra 8 saniye bekleyebilir; vazgeçip hatayı bildirmeden önce azami bir gecikmeye ve azami deneme sayısına kadar.
Gerçek uygulamalar jitter, yani her gecikmede rastgele bir değişim ekler. Bu olmadan aynı anda başarısız olan binlerce istemci aynı anlarda yeniden dener ve sunucuya senkronize dalgalar halinde vurur; buna thundering herd (gürleyen sürü) sorunu denir. Full jitter denen popüler bir yaklaşım, sıfır ile geçerli üstel sınır arasında rastgele bir gecikme seçer. İstemciler ayrıca sunucu bir Retry-After başlığı gönderdiğinde, örneğin 429 Too Many Requests veya 503 Service Unavailable yanıtıyla birlikte, ona uymalıdır.
Exponential backoff, meşgul bir arkadaşı aramaya benzer: yanıt vermezse art arda elli kez aramak yerine bir dakika sonra, sonra beş dakika sonra, sonra bir saat sonra yeniden denersiniz. HTTP istemcilerine, bulut SDK'larına, mesaj kuyruğu tüketicilerine, veritabanı sürücülerine ve arka plan işi sistemlerine yerleşiktir ve düşük seviyeli protokollerde de görülür: klasik Ethernet, iki cihaz aynı anda ilettiğinde toparlanmak için ikili exponential backoff kullanıyordu.
Backoff, iyi bir yeniden deneme politikasının yalnızca yarısıdır. Yalnızca geçici olması muhtemel hataları, örneğin zaman aşımlarını, kopan bağlantıları, 429 ve 5xx yanıtlarını yeniden deneyin; 400 Bad Request veya 401 Unauthorized gibi her seferinde aynı şekilde başarısız olacak hataları asla yeniden denemeyin. Yeniden denenen bir ödeme müşteriden iki kez ücret almasın diye yalnızca idempotent işlemleri yeniden deneyin ya da idempotency key kullanın. Backoff ayrıca circuit breaker'dan farklıdır: backoff tekil isteklerin yeniden denemelerini yavaşlatır; circuit breaker ise başarısız bir servise bir süre tamamen istek göndermeyi durdurur.
Önemli noktalar
- Her yeniden deneme bir öncekinden daha uzun bekler; genellikle gecikmeyi ikiye katlar.
- Rastgele jitter, birçok istemcinin senkron biçimde yeniden denemesini engeller.
- Hem azami gecikmeyi hem de deneme sayısını sınırlayın.
- Yalnızca geçici hataları ve yalnızca tekrarlanması güvenli işlemleri yeniden deneyin.
- Sunucu gönderdiğinde
Retry-Afterbaşlığına uyun.
Örnek
async function fetchWithRetry(url, maxAttempts = 5) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
const res = await fetch(url).catch(() => null); // network error -> null
if (res && res.status !== 429 && res.status < 500) return res; // success or permanent error
if (attempt === maxAttempts - 1) break;
const limit = Math.min(30_000, 1000 * 2 ** attempt); // 1s, 2s, 4s, 8s... capped at 30s
const delay = Math.random() * limit; // full jitter
await new Promise((resolve) => setTimeout(resolve, delay));
}
throw new Error("Request failed after " + maxAttempts + " attempts");
}Sık sorulan sorular
Exponential backoff'a neden jitter eklenir?
Jitter olmadan birlikte başarısız olan istemciler birlikte yeniden dener; bu da toparlanmakta olan bir sunucuyu ayakta tutamayan tekrarlı trafik artışları yaratır. Her gecikmeyi rastgele kılmak yeniden denemeleri zamana eşit yayar.
Başarısız bir isteği kaç kez yeniden denemeliyim?
Kullanıcıya dönük istekler için birkaç on saniyeyle sınırlanmış gecikmelerle 3 ile 5 deneme yaygındır. Arka plan işleri çok daha uzun süre yeniden deneyebilir ve yine de başarısız olan iş genellikle raporlanır ya da bir dead-letter kuyruğuna taşınır.
Exponential backoff ile rate limiting arasındaki fark nedir?
Rate limiting, bir istemcinin kaç istek gönderebileceğini sınırlamak için sunucu tarafından uygulanır. Exponential backoff ise istekler reddedildiğinde ya da sunucu başarısız olduğunda iyi davranışlı bir istemcinin nasıl tepki verdiğidir.
İlgili sayfalar
- Rate LimitingBackend ve API'ler, s. 37Rate limiting, istemcinin belli bir sürede yapabileceği istek sayısını sınırlayıp sunucuyu ya da API'yi kötüye kullanımdan ve aşırı yükten koruyan tekniktir.
- IdempotencyBackend ve API'ler, s. 23Idempotency, bir işlemin bir kez de çalışsa çok kez de çalışsa aynı sonucu üretmesi özelliğidir; böylece bir isteğin yanlışlıkla tekrarlanması güvenli olur.
- Circuit Breaker DeseniYazılım Mimarisi, s. 4Circuit breaker deseni, arızalı bir bağımlılığa yapılan çağrıları bir süre durdurarak ve zaman aşımlarını beklemek yerine hızlıca hata vererek sistemi korur.
- HTTP Durum KoduWeb Geliştirme, s. 22HTTP durum kodu, sunucunun her yanıtla gönderdiği ve isteğin başarılı mı, başarısız mı olduğunu ya da ek işlem mi gerektirdiğini bildiren üç haneli sayıdır.
- Hata ToleransıYazılım Mimarisi, s. 17Hata toleransı, bir sistemin bazı donanım ya da yazılım bileşenleri arızalandığında, belki azalmış kapasiteyle de olsa doğru çalışmayı sürdürebilmesidir.
- Arka Plan İşiBackend ve API'ler, s. 5Arka plan işi, bir sunucunun normal istek-yanıt döngüsünün dışında çalıştırdığı görevdir; e-posta gönderme gibi yavaş işler kullanıcıları bekletmez.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin