Retry, Backoff ve Jitter — Herkes Aynı Anda Tekrar Denerse
Önce şunu oku: Backpressure ve Yük Atma — Kuyruk Dolarsa Ne Olur?
30 saniyede özet
Tekrar denemek kısa hataları kurtarır, ama herkes aynı anda tekrar denerse düzelmek üzere olan servisi yeniden düşürür. Exponential backoff aralıkları açar, jitter ise denemeleri zamana yayar.
Sevdiğin fırın on dakikalığına kapanmış, kapıda “birazdan döneceğiz” yazıyor. Sen ve yirmi kişi daha tam on dakika sonra dönüyorsunuz. Kapı açıldığı an herkes aynı anda içeri girmeye çalışıyor ve kimse kıpırdayamıyor.
-
Bayt: Bakiye servisi üç saniyeliğine düştü. Uygulama hata alınca hemen tekrar deniyor, sorun yok!
-
Sen: Servis üç saniye sonra döndü ama hâlâ cevap veremiyor.
-
Bayt: Ayakta ama boğuluyor... herkes aynı anda kapıda.
-
Bayt: O zaman sorun düşmesi değil, nasıl geri döndüğümüz. Tekrar denemelere bakalım.
Tekrar denemek neden iki ucu keskin?
Ağ bir anlığına koptuysa ya da servis yeniden başlıyorsa, birkaç saniye sonra tekrar denemek isteği kurtarır. Kullanıcı hiçbir şey fark etmez.
Sorun, binlerce istemcinin aynı kesintiyi aynı anda yaşamasıdır. Hepsi hemen tekrar denerse, servis ayağa kalktığı an normal yükünün katlarıyla karşılaşır. Buna thundering herdÇok sayıda istemcinin aynı anda aynı kaynağa yüklenmesi; örneğin bir kesintiden sonra herkesin aynı anda tekrar denemesi.Sözlükte gör → denir.
Kafam karıştı, daha basit anlat
Tekrar denemek tek istemci için iyidir. Herkes aynı anda yaparsa servisi yeniden düşürür.
Tekrar denemek (retry) hangi durumda gerçekten işe yarar?
Thundering herd ne demektir?
Beklemeyi büyüt, sonra dağıt
120 istemci aynı anda tekrar deniyor. Servis saniyede 40 çağrı kaldırabiliyor ve fazlası onu yavaşlatıyor. O saniyede kaç istemci cevap alır? Cevabı göster
40’tan da az. Kaldıramadığı her çağrı da iş tüketir; servis boğulur ve normalde yapabileceğinden azını bitirir. Simülatördeki modelde yalnızca 13 istemci cevap alıyor.
Adım adım oku
- Dükkân kısa süre kapalı; herkes geri dönecek.
- Kapı açılınca herkes aynı anda gelir ve kapı tıkanır.
- Herkes biraz farklı zamanda gelirse kapı akar.
- Tekrar denemeleri zamana yay.
İlk çare exponential backoffBaşarısız her denemeden sonra bekleme süresini katlayarak artırmak. Süreye rastgele bir pay (jitter) eklenir ki istemciler aynı anda geri dönmesin.Sözlükte gör →: her başarısız denemeden sonra beklemeyi ikiye katla. 1, 2, 4, 8 saniye. Servis toparlanmak için zaman kazanır.
Ama herkes aynı takvimle beklerse, tekrar denemeler yine aynı saniyelere yığılır. jitterTekrar deneme beklemesine eklenen rastgelelik. Aynı anda hata alan istemcilerin farklı anlarda dönmesini sağlar.Sözlükte gör → her istemcinin beklemesini rastgele biraz farklılaştırır; aynı kalabalık zamana yayılır.
Kafam karıştı, daha basit anlat
Backoff aralıkları açar. Jitter herkesin farklı bir anda gelmesini sağlar.
Exponential backoff ne yapar?
Exponential backoff varken neden jitter da gerekir?
Kendin gör
Herkes aynı anda tekrar denerse
Tohum 112821- 0
- 4
- 8
- 12
- 16
- 20
- ✕ servis kapalı
- ⚠ kapasite aşıldı
- ✓ başarılı
- - - - kapasite: 40/sn
Oynat ya da adımla: her adım dört saniye.
Şu an ne oldu?
Hemen tekrar dene (her saniye) · en fazla 4 deneme
Servis ilk 3 saniye kapalı, sonra saniyede 40 çağrı kaldırıyor. 120 istemci bekliyor.
Görevler0/3
Servis ayağa kalktığında istemcilerin yarısından fazlasını kaybetaçık
İpucu
Varsayılan ayarlar yeter.
Backoff kullanıp yine de servise 100 denemelik bir dalga gönderaçık
İpucu
Herkes aynı takvimle beklesin.
Hiç vazgeçen olmadan bütün istemcileri cevaplataçık
İpucu
Beklemeleri istemciden istemciye farklılaştır.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Herkes her saniye tekrar deniyor: 120 istemciden yalnızca 13’ü cevap aldı.
- “Exponential backoff” seç. Aralar açıldı, ama denemeler yine 120’lik dalgalar halinde geldi.
- “Sabırlı istemci”yi aç. Daha çok deneme hakkı var, ama dalgalar sürdüğü için yarısı bile cevap alamadı.
- “Exponential backoff + jitter” seç. Denemeler dağıldı ve 120 istemcinin hepsi cevap aldı.
Servis ayağa kalktığı saniyede kapasitesinin üç katı tekrar deneme alıyor. Ne olur?
Deneme hakkını 4'ten 8'e çıkarmak ama jitter eklememek ne sağlar?
Tuzaklar
Her şeyi tekrar denemek. 400 ya da 404 bir dakika sonra da aynı cevabı verir. Yalnızca geçici hataları (zaman aşımı, 503, 429) tekrar dene ve 429’da Retry-After’a uy.
Para çeken bir isteği körü körüne tekrarlamak. İlk istek aslında işlenmiş, yalnızca cevabı kaybolmuş olabilir. Ödeme gibi işlemlerde tekrar denemeden önce idempotency key gönder.
Katlanan tekrarlar. Üç katmanın her biri üç kez denerse, en alttaki servis tek bir tıklama için 27 çağrı görür. Tekrar denemeyi tek bir katmanda yap.
Kafam karıştı, daha basit anlat
Yalnızca geçici hatayı tekrar dene, ödemede idempotency key kullan, tekrarı tek katmanda tut.
Bir ödeme isteği zaman aşımına uğradı. Tekrar denemeden önce ne gerekir?
Aşağıdaki örnek bir mobil bankanın bakiye istemcisinden: yalnızca geçici hatalarda, jitter’lı backoff ile ve sınırlı sayıda tekrar deneme.
Derinleş · Bakiye istemcisi: jitter'lı backoff, yalnızca geçici hatalar, sınırlı deneme 4 dosya · ~76 satır · ilk okumada atlayabilirsin
Kendini sına
Bir hata alındığında hemen tekrar denemek her zaman en güvenli seçimdir.
Üç katmanlı bir zincirde her katman 3 kez deniyor. En alttaki servis tek bir kullanıcı tıklaması için en çok kaç çağrı görebilir?
Aklında kalacak üç şey
- 1 Hemen ve sürekli tekrar denemek, kısa bir kesintiyi uzun bir kesintiye çevirebilir. Servis ayağa kalktığı an bütün istemcilerin tekrar denemesiyle karşılaşır.
- 2 Exponential backoff aralıkları açar ama tek başına yetmez. Herkes aynı takvimle beklerse tekrar denemeler yine aynı saniyelere yığılır.
- 3 Jitter her istemcinin bekleme süresini biraz farklılaştırır. Aynı sayıda deneme zamana yayılır ve servis yükü kaldırabilir.
4 kart sonraki derste seni bekliyor