Timeout ve Retry: Ağ Hatalarına Karşı İlk Savunma
Bir API isteği gönderdin ama hiç cevap gelmedi. Sunucu çöktü mü? Ağ bağlantısı koptu mu? timeout ve retry mekanizmaları tam bu noktada devreye giriyor.
Timeout, bir işlemin tamamlanması için belirlenmiş maksimum bekleme süresidir. Eğer bu süre içinde cevap gelmezse, işlem durdurulur ve hata döndürülür. Örneğin 5 saniye timeout ayarlıysan ve sunucu 6. saniyede cevap verirse, artık çok geç, bağlantı kapatılır.
Retry, başarısız bir isteği yeniden denemenin stratejisidir. Fakat düşüncesizce tekrar etmek işi kötüleştirebilir. Bunun yerine exponential backoff kullanırız: her başarısızlıkta bekleme süresi katlanarak artar (1s, 2s, 4s, 8s...).
Aşağıda bir API çağrısını timeout ve retry ile yapan kod var:
1import requests2from requests.adapters import HTTPAdapter3from urllib3.util.retry import Retry4import time56def requests_with_retry(url, max_retries=3, timeout=5):7session = requests.Session()89# Retry stratejisi: 3 deneme, exponential backoff10retry_strategy = Retry(11total=max_retries,12status_forcelist=[429, 500, 502, 503, 504],13allowed_methods=["GET", "POST"],14backoff_factor=1 # 1s, 2s, 4s, 8s...15)1617adapter = HTTPAdapter(max_retries=retry_strategy)18session.mount("http://", adapter)19session.mount("https://", adapter)2021try:22response = session.get(url, timeout=timeout)23response.raise_for_status()24return response.json()25except requests.exceptions.Timeout:26print(f"Timeout! {timeout}s içinde cevap gelmedi.")27except requests.exceptions.RequestException as e:28print(f"Hata: {e}")29finally:30session.close()3132# Kullanım33result = requests_with_retry("https://api.example.com/data", max_retries=3, timeout=5)34print(result)Beklenen çıktı:
- Başarılı istek: API'den gelen JSON verisi
- Timeout: "Timeout! 5s içinde cevap gelmedi."
- Retry sonrası başarı: Üçüncü denemede cevap gelirse veri döner
1. `Retry` nesnesi oluştur: kaç deneme, hangi hata kodlarında yeniden dene
2. `HTTPAdapter` ile session'a bağla
3. `timeout` parametresiyle maksimum bekleme süresini koy
4. Hata türlerine göre işlem yap (Timeout, Connection Error vb.)
Bu yaklaşım geçici ağ sorunlarını otomatik çözer ve sunucuya gereksiz yük bindirmez.
0 yorum