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:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import requests
2from requests.adapters import HTTPAdapter
3from urllib3.util.retry import Retry
4import time
5
6def requests_with_retry(url, max_retries=3, timeout=5):
7session = requests.Session()
8
9# Retry stratejisi: 3 deneme, exponential backoff
10retry_strategy = Retry(
11total=max_retries,
12status_forcelist=[429, 500, 502, 503, 504],
13allowed_methods=["GET", "POST"],
14backoff_factor=1 # 1s, 2s, 4s, 8s...
15)
16
17adapter = HTTPAdapter(max_retries=retry_strategy)
18session.mount("http://", adapter)
19session.mount("https://", adapter)
20
21try:
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()
31
32# Kullanım
33result = 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz