
Yeniden Deneme Stratejisi: Ne Zaman, Kaç Kez, Ne Kadar Bekleyerek?
Bir dış servis kısa bir kesinti yaşadı ve yüzlerce isteğiniz başarısız oldu. Uygulamanız hepsini hemen tekrar denedi. Servis toparlanmaya çalışırken gelen bu dalga onu tekrar çökertti.
Bu yazı, yeniden denemeyi doğru yapmayı ele alıyor.
Her Hata Tekrar Denenmez
| Hata türü | Tekrar denenmeli mi? |
|---|---|
| Ağ zaman aşımı | Evet |
| Sunucu hatası | Evet |
| Hız sınırı aşımı | Evet, bekleyerek |
| Kimlik doğrulama hatası | Hayır |
| Geçersiz istek | Hayır |
| Bulunamadı | Hayır |
Son üç satır kesin kuraldır: geçersiz bir isteği tekrar denemek aynı hatayı tekrar üretir — bu tür hatalar geçici değildir ve deneme yalnızca kaynak israfıdır.
Ayrım basittir: sorun sizde ise tekrar denemek anlamsız, karşı tarafta veya ağda ise anlamlıdır.
Üçüncü satır özel bir durumdur ve karşı taraf genellikle ne kadar bekleneceğini de bildirir.
Bu bilgiyi yok sayıp hemen tekrar denemek, sınırın daha da sıkılaşmasına yol açar.
Sabit Bekleme Yetmez
- Sabit aralık dalga üretir.
- Tüm istemciler aynı anda döner.
- Servis tekrar çöker.
İkinci madde başta anlatılan felaketi açıklar: aynı anda başarısız olan yüz istek, sabit bir bekleme süresinden sonra yine aynı anda tekrar dener — toparlanmaya çalışan servis, düzenli aralıklarla gelen dalgalarla sürekli devrilir.
Bu desene gürleyen sürü denir.
Çözüm iki parçalıdır ve sonraki iki bölümde ele alınıyor.
Artan Bekleme
- İlk denemede kısa bekle.
- Her denemede süreyi katla.
- Bir üst sınır belirle.
İkinci madde hem hızlı toparlanmayı hem nazikliği sağlar: bir saniye, iki saniye, dört saniye şeklinde artan bir bekleme, geçici bir aksaklıkta hızla toparlanır ama uzun süren bir kesintide karşı tarafa yük bindirmez.
Kısa süren sorunlar ilk denemede çözülür.
Üçüncü madde ise sınırsız büyümeyi önler. Süre bir noktadan sonra sabitlenmelidir.
Aksi hâlde onuncu denemede saatlerce beklenir.
Rastgele Dağıtma
| Yaklaşım | Sonuç |
|---|---|
| Tam olarak iki saniye | Hepsi aynı anda |
| Sıfır ile iki saniye arası | Yayılır |
İkinci satır artan beklemeyi tamamlar ve etkisi büyüktür: bekleme süresine rastgelelik eklemek, aynı anda başarısız olan isteklerin farklı zamanlarda dönmesini sağlar — dalga düzleşir ve servis toparlanma şansı bulur.
Bu tek ekleme, artan beklemenin faydasını kat kat artırır.
Rastgelelik olmadan artan bekleme yalnızca dalganın aralığını uzatır, dalgayı ortadan kaldırmaz.
Bu iki tekniğin birlikte kullanılması standart yaklaşımdır.
Tekrar Güvenli mi?
Yeniden denemeden önce sorulması gereken kritik soru:
- Okuma işlemleri güvenlidir.
- Yazma işlemleri tehlikelidir.
- Zaman aşımı belirsizlik üretir.
Üçüncü madde en sinsi durumdur: zaman aşımı, isteğin ulaşmadığı anlamına gelmez — istek işlenmiş ama yanıt dönerken kaybolmuş olabilir ve tekrar denemek işlemi iki kez yaptırır.
Bu, ödeme akışlarında çift tahsilat demektir.
Çözüm, her isteğe benzersiz bir kimlik eklemektir. Karşı taraf aynı kimliği ikinci kez gördüğünde işlemi tekrarlamaz, ilk sonucu döndürür.
Bu kimlik olmadan yazma işlemleri güvenle tekrar denenemez.
Kaç Kez Denemeli?
| Bağlam | Uygun sayı |
|---|---|
| Kullanıcı bekliyor | Bir veya iki |
| Arka plan işi | Daha fazla |
| Kuyruk işlemi | Uzun süre denenebilir |
Birinci satır kullanıcı deneyimiyle sınırlıdır: kullanıcı ekranın başında beklerken üç kez artan bekleme ile denemek, ona yedi saniye boşuna bekletmek demektir — hızlıca hata gösterip tekrar denemeyi ona bırakmak daha iyidir.
İnsanlar bekletilmekten hoşlanmaz.
Üçüncü satır ise en esnek olanıdır. Kuyruktaki bir iş saatlerce tekrar denenebilir ve kimse beklemez.
Bu nedenle kullanıcıyı bekletmemek için işi kuyruğa almak, hem deneyimi hem dayanıklılığı iyileştirir.
Devre Kesici ile Birlikte
- Yeniden deneme geçici hatalar için.
- Devre kesici kalıcı arızalar için.
- İkisi birlikte çalışır.
Üçüncü madde doğru mimariyi verir: devre kesici açıkken yeniden deneme yapılmamalıdır — servisin çalışmadığı zaten bilinirken üç kez daha denemek, devre kesicinin varlık sebebini ortadan kaldırır.
Yeniden deneme, devre kapalıyken devrededir.
Ayrıca yeniden deneme hataları devre kesici sayacını beslemelidir; her başarısız deneme sayılmalıdır.
Bu iki mekanizma birbirini tamamlar ve ayrı ayrı yeterli değildir.
Katmanlı Deneme Tuzağı
| Katman | Deneme sayısı |
|---|---|
| HTTP kütüphanesi | 3 |
| Servis sarmalayıcı | 3 |
| Kuyruk işçisi | 3 |
| Toplam | 27 |
Son satır beklenmedik bir çarpımı gösterir: her katmanın bağımsız olarak üç kez denemesi, toplamda yirmi yedi isteğe dönüşür — çöken bir servise düşündüğünüzün dokuz katı yük bindirirsiniz.
Bu çarpım kod okunarak fark edilmez.
Çözüm, yeniden denemeyi tek bir katmanda yapmak ve diğerlerinde kapatmaktır.
Hangi katmanın sorumlu olduğu açıkça belirlenmeli ve belgelenmelidir.
İzlenmesi Gerekenler
- Deneme sayısı.
- Başarıya ulaşan deneme numarası.
- Tükenen deneme sayısı.
İkinci madde çok bilgilendirici bir metriktir: isteklerin çoğu ikinci veya üçüncü denemede başarılı oluyorsa, altta yatan bir kararlılık sorunu var demektir — çalışıyor görünen sistem aslında sürekli hata veriyordur.
Bu, yeniden denemenin gizlediği bir sorundur.
Yeniden deneme bir çözüm değil, bir yara bandıdır; asıl neden araştırılmalıdır.
Üçüncü madde ise gerçek başarısızlıkları gösterir ve alarm üretmelidir.
Dış servis çağrılarını ve deneme davranışını izleyebilmek için uygulama metriklerine ihtiyacınız olur; VDS altyapı hizmeti üzerinde kendi izleme yığınınızı kurabilirsiniz.
Sonuç
Yeniden denemede en yaygın hata, sabit aralık kullanmaktır: aynı anda başarısız olan yüz istek, sabit bekleme sonrası yine aynı anda döner ve toparlanmaya çalışan servisi tekrar devirir. Artan beklemeye rastgelelik ekleyin; dalga düzleşir. Yazma işlemlerinde ise dikkat: zaman aşımı isteğin ulaşmadığı anlamına gelmez — istek işlenmiş ama yanıt kaybolmuş olabilir. Ve denemeyi tek katmanda yapın; katmanlar çarpılır.
Sıkça Sorulan Sorular (SSS)
Her hatayı tekrar denemeli miyim?
Hayır. Ağ zaman aşımı, sunucu hatası ve hız sınırı aşımı tekrar denenebilir; kimlik doğrulama hatası, geçersiz istek ve bulunamadı denenmemelidir. Ayrım basittir: sorun sizde ise tekrar denemek anlamsız, karşı tarafta veya ağda ise anlamlıdır.
Ne kadar beklemeliyim?
Artan bekleme kullanın — bir, iki, dört saniye şeklinde katlanan bir süre hem geçici aksaklıkta hızla toparlanır hem uzun kesintide yük bindirmez. Mutlaka rastgelelik ekleyin; rastgelelik olmadan artan bekleme yalnızca dalganın aralığını uzatır, dalgayı kaldırmaz.
Yazma işlemlerini tekrar denemek güvenli mi?
Değil, önlem almadan. Zaman aşımı isteğin ulaşmadığı anlamına gelmez — istek işlenmiş ama yanıt dönerken kaybolmuş olabilir ve tekrar deneme işlemi iki kez yaptırır. Her isteğe benzersiz bir kimlik ekleyin; karşı taraf aynı kimliği tekrar gördüğünde ilk sonucu döndürür.
Kaç katmanda deneme yapmalıyım?
Yalnızca birinde. Her katmanın bağımsız üç kez denemesi toplamda yirmi yedi isteğe dönüşür ve çöken servise dokuz katı yük bindirirsiniz. Bu çarpım kod okunarak fark edilmez; hangi katmanın sorumlu olduğunu belirleyip diğerlerinde denemeyi kapatın.