Kafayı yiyecektim. Bir veri toplama projem için bir API'den sürekli veri çeken bir Python script'i yazmıştım. Her şey harika çalışıyordu, ta ki... ta ki sunucu tarafında bir bakım yapılana kadar.
"Connection Reset" ve Ardından Sessizlik
Script'im basitti. Belirli aralıklarla istek at, gelen JSON'ı parse et, veritabanına kaydet. Sorun şuydu ki, bağlantı hatası durumunda sadece log'a bir şeyler yazıp, try-except bloğu içinde sessizce devam ediyordu. Hata yakalıyordu evet, ama benim aptal kodum, bağlantı koptuktan sonra bile "bir dahaki sefere belki çalışır" umuduyla sonsuz döngüsüne devam ediyordu.
Gördüğünüz gibi, except bloğu sadece yazdırıp geçiyor. Veri data değişkenine hiçbir zaman gelmiyor ama döngü durmuyor!
3 Gün Sonra Farkına Varmak
Perşembe akşamı başlattım, Cuma ofiste değildim. Hafta sonu da uzaktan bakmadım. Pazartesi geldiğimde kontrol panelime baktım: "Son kayıt: Perşembe 23:45". İçimden "Yok artık!" dedim. Script çalışıyor muydu? Evet, ps aux | grep python ile baktığımda hâlâ oradaydı. CPU kullanımı %0.1 civarı, hafıza sabit. Meğerse 3 gündür saniyede bir "Bağlantı hatası..." yazdırıp uyuyormuş. Log dosyası GB'ları bulmuştu resmen.
Alınan Acı Ders ve Çözüm
StackOverflow'da bile böyle saçma bir hatayı aramaya utandım. Çözüm aslında basitti: Circuit Breaker deseni veya basit bir "peş peşe hata sayacı". Belirli bir sayıda ardışık bağlantı hatasından sonra script'in kendini durdurması ve bana bir e-posta/telegram bildirimi atması gerekiyordu.
Meğerse sorun şuradaymış. Hata yönetimi sadece loglamak değil, sistemi güvenli bir duruma getirmekmiş. Siz de benim gibi "ya olur ya olur" mantığıyla yazdığınız script'lerin arka planda zombi gibi çalıştığı oldu mu? Bu tarz durumlar için kullandığınız daha şık pattern'ler veya kütüphaneler (Tenacity gibi) var mı? Fikirlerinizi bekliyorum!
Script'im basitti. Belirli aralıklarla istek at, gelen JSON'ı parse et, veritabanına kaydet. Sorun şuydu ki, bağlantı hatası durumunda sadece log'a bir şeyler yazıp, try-except bloğu içinde sessizce devam ediyordu. Hata yakalıyordu evet, ama benim aptal kodum, bağlantı koptuktan sonra bile "bir dahaki sefere belki çalışır" umuduyla sonsuz döngüsüne devam ediyordu.
Python:
while True:
try:
data = requests.get(api_url, timeout=10).json()
process_data(data)
except requests.exceptions.ConnectionError:
print("Bağlantı hatası, 60 saniye sonra tekrar deneniyor...")
time.sleep(60)
Gördüğünüz gibi, except bloğu sadece yazdırıp geçiyor. Veri data değişkenine hiçbir zaman gelmiyor ama döngü durmuyor!
Perşembe akşamı başlattım, Cuma ofiste değildim. Hafta sonu da uzaktan bakmadım. Pazartesi geldiğimde kontrol panelime baktım: "Son kayıt: Perşembe 23:45". İçimden "Yok artık!" dedim. Script çalışıyor muydu? Evet, ps aux | grep python ile baktığımda hâlâ oradaydı. CPU kullanımı %0.1 civarı, hafıza sabit. Meğerse 3 gündür saniyede bir "Bağlantı hatası..." yazdırıp uyuyormuş. Log dosyası GB'ları bulmuştu resmen.
StackOverflow'da bile böyle saçma bir hatayı aramaya utandım. Çözüm aslında basitti: Circuit Breaker deseni veya basit bir "peş peşe hata sayacı". Belirli bir sayıda ardışık bağlantı hatasından sonra script'in kendini durdurması ve bana bir e-posta/telegram bildirimi atması gerekiyordu.
Python:
consecutive_errors = 0
MAX_ERRORS = 5
while True:
try:
data = requests.get(api_url, timeout=10).json()
process_data(data)
consecutive_errors = 0 # Başarılı istek, sayacı sıfırla
except requests.exceptions.ConnectionError as e:
consecutive_errors += 1
if consecutive_errors >= MAX_ERRORS:
send_alert("API ÖLDÜ! Script durduruldu.")
break # Döngüden çık!
time.sleep(60)
Meğerse sorun şuradaymış. Hata yönetimi sadece loglamak değil, sistemi güvenli bir duruma getirmekmiş. Siz de benim gibi "ya olur ya olur" mantığıyla yazdığınız script'lerin arka planda zombi gibi çalıştığı oldu mu? Bu tarz durumlar için kullandığınız daha şık pattern'ler veya kütüphaneler (Tenacity gibi) var mı? Fikirlerinizi bekliyorum!