Ana içeriğe geç

Exponential Backoff

Okunuşu
ekspınenşıl bekof
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/exponential-backoff

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-After başlığına uyun.

Örnek

Exponential backoff ve full jitter ile bir isteği yeniden denemekjavascript
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

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar