Olay nasıl başladı
Bir süre önce ikinci el ilan sitelerinde uygun fiyatlı donanım yakalamak için kendi sistemimi kurmaya karar verdim. Amacım belliydi, sürekli ilanları kontrol eden ve yeni bir şey düştüğünde bana haber veren bir Python betiği yazmak. Her şey çok güzel başladı, sistemi kurdum, sunucuya attım ve arkama yaslandım. Günler geçti, sistemin arka planda sessizce çalıştığını düşünüyordum. Ancak bir hafta boyunca tek bir bildirim bile gelmedi. İlk başlarda piyasanın durgun olduğunu düşündüm. Belki kimse ilan vermiyordu, belki de fiyatlar çok yüksekti. Ancak içimden bir ses bir şeylerin ters gittiğini söylüyordu. Bir gün kontrol etmek için sisteme bağlandım ve log dosyalarına baktım. Loglar tertemizdi, hiçbir hata mesajı yoktu. Sistem sanki çalışıyor gibi görünüyordu ama aslında hiçbir veri çekmiyordu. Büyük bir hayal kırıklığıydı. Haftalarca beklediğim fırsatların aslında sistemimdeki bir aksaklık yüzünden gözümden kaçtığını anlamak canımı sıktı. Otomasyonun sessizliği bazen en büyük tehlikedir. Hiçbir hata vermeyen ama sonuç da üretmeyen bir sistem, çalışmayan bir sistemden daha kötüdür. Çünkü çalışmadığını anında fark edemezsin.
Bu nerede karşına çıkar
Bu durum aslında veri kazıma veya otomasyon işleriyle uğraşan herkesin başına gelebilecek bir durum. Özellikle borsa verileriyle çalışırken, fiyat takibi yaparken veya sürekli veri akışı isteyen bir bot geliştirirken bu sessiz başarısızlık çok yaygındır. Sisteminiz bir web sitesine istek atar, site sizi yönlendirir veya engeller ama sizin kodunuz bunu bir hata olarak algılamaz. Sadece boş bir sayfa veya giriş yapmanızı isteyen bir form sayfası alırsınız. Kodunuz ise bu sayfayı başarıyla indirdiğini düşünür, içinde ilan arar, bulamaz ve bir sonraki isteğe geçer. Bu döngü günlerce devam edebilir. Özellikle sunucu tarafında kaynak tüketimi veya disk dolması gibi durumlar sistemin yavaşlamasına veya fark ettirmeden durmasına neden olabilir. Benzer bir durumu borsa verilerini çeken bir agent kurarken de yaşayabilirsiniz. Veri akışı kesilir ama uygulama hata fırlatmaz, siz de verilerin gerçekten bittiğini sanırsınız. Bu durumun en tehlikeli tarafı, her şeyin yolunda olduğuna dair sahte bir güven duygusu vermesidir. Gerçek hayatta bu tür hatalar genellikle sistemin dış kaynaklara bağımlı olduğu noktalarda ortaya çıkar.
Kök neden
Sistemin neden sessizce sustuğunu araştırırken iki temel sorunla karşılaştım. İlki çok basit bir donanım sorunu olan disk dolmasıydı. Sunucudaki loglar ve geçici dosyalar zamanla birikmiş ve disk kapasitesini doldurmuştu. Disk yüzde 98 doluluk oranına ulaştığında tarayıcı artık yeni veri yazamıyor ve sessizce çöküyordu. Ancak uygulama hata fırlatmadığı için izleme katmanı bu durumu göremiyordu. İkinci sorun ise çok daha sinsiceydi. İlan sitesi oturumumu düşürmüştü. Siteye yaptığım istekler artık ilan sayfası yerine giriş yapmam gereken bir sayfaya yönleniyordu. Benim kodum ise gelen sayfayı bir ilan sayfası olarak algılayıp içinde arama yapıyordu. İçerik bulunamadığında da hata vermek yerine boş sonuç döndürüyordu. Bu ikili durum, sistemin hem kaynak yetersizliğinden dolayı çökmesine hem de mantıksal olarak yanlış verilerle çalışmasına neden oluyordu. Disk yüzde 98 seviyesindeyken sistem nefes alamıyordu. Kaçak günlük dosyalarını temizleyip disk alanını yüzde 65 seviyesine indirdiğimde sistemin tekrar canlandığını gördüm ama mantıksal hata hala devam ediyordu.
Adım adım çözüm
Sorunu çözmek için iki temel kontrol ekledim. İlki disk doluluğunu izleyen bir kontrol mekanizmasıydı. Artık iş başlamadan önce disk alanını kontrol ediyorum. Eğer disk eşiği aşılmışsa sistem hiç başlamıyor ve bana hemen bir uyarı gönderiyor. İkinci kontrol ise gelen sayfanın gerçekten bir ilan sayfası olup olmadığını doğrulamak. Eğer gelen sayfanın içeriğinde ilanlara ait özel yapılar yoksa veya sayfa giriş sayfasına yönlendirilmişse bunu bir hata olarak kabul ediyorum.
if disk_kullanimi > 85: raise Exception(Disk dolmak uzere, islem durduruldu) if giris_sayfasina_yonlendi(sayfa_icerigi): raise Exception(Oturum dusmus, veri cekilemiyor) Bu kod parçası, sistemin boş yere çalışmasını engelliyor. Disk doluluğu belirli bir seviyenin üzerine çıktığında veya site beni giriş yapmaya zorladığında sistem anında hata veriyor ve çalışmayı durduruyor. Bu şekilde sessiz başarısızlıkların önüne geçmiş oldum. Artık sistemim bir hata yaptığında bunu bana hemen bildiriyor ve ben de müdahale edebiliyorum.
Yolda çıkan hatalar ve nasıl giderildi
Çözümleri uygularken bazı zorluklarla karşılaştım. İlk olarak disk kontrolünü nereye koyacağıma karar vermem gerekti. Başlangıçta her döngünün içinde kontrol etmeyi düşündüm ama bu çok fazla işlem gücü tüketiyordu. Sonra sadece işlemler başlamadan önce kontrol etmenin yeterli olacağına karar verdim. İkinci olarak giriş sayfası kontrolü yaparken bazı yanlış alarmlar aldım. Site bazen yüklenme sırasında geçici olarak farklı bir sayfa gösterebiliyordu. Bunu engellemek için birkaç saniye bekleyip tekrar kontrol eden bir mekanizma ekledim. Yani sayfayı bir kez kontrol edip hemen hata vermiyorum, bir saniye sonra tekrar bakıyorum. Hâlâ giriş sayfasındaysa o zaman hata veriyorum. Bu, sistemin daha kararlı çalışmasını sağladı. Ayrıca hata mesajlarını düzgün bir şekilde loglamayı öğrendim. Eskiden sadece hata verip duruyordu, şimdi hatanın nedenini de log dosyalarına yazıyor. Bu sayede neyin ters gittiğini anlamak çok daha kolay hâle geldi. Hata ayıklama süreci, sistemin sağlamlığını artırmak için harika bir fırsat oldu.
Karşılaştırma
Bu sorunu çözmek için farklı yöntemler de vardı. Mesela harici bir izleme aracı kullanabilirdim. Sistem çalışıyor mu diye dışarıdan bakan bir servis kullanmak çok daha profesyonel görünebilirdi. Ancak ben kendi sistemimin içinde bu kontrolleri yapmayı tercih ettim. Çünkü harici araçlar bazen çok karmaşık olabiliyor ve kurulumuyla uğraşmak istemedim. Bir diğer alternatif ise daha gelişmiş bir tarayıcı kütüphanesi kullanmaktı. Ancak mevcut sistemim zaten ihtiyacımı karşılıyordu, sadece biraz daha dikkatli olmam gerekiyordu. Kendi kontrol mekanizmalarımı yazmak bana sistemin nasıl çalıştığını daha iyi öğretti. Ayrıca bu yöntem herhangi bir ek maliyet veya bağımlılık getirmiyor. Sadece kodun içine eklediğim birkaç basit kontrol satırı ile sorunu tamamen ortadan kaldırdım. Bazen en basit çözümler, en etkili olanlardır. Karmaşık sistemler kurmak yerine, basit ve güvenilir hata kontrolleri eklemek uzun vadede daha az baş ağrısı yaratıyor.
Bundan sonra ne yapmalı
Bundan sonra yapılacak ilk şey, sistemin çıktı üretmediği her durumu bir hata olarak kabul etmek. Eğer sistem bir saat boyunca hiçbir ilan bulamadıysa, bu normal bir durum değildir. Bunu sistemin kendine bildirmesi gerekiyor. Bunun için bir zamanlayıcı ekleyebilirsin. Eğer belirli bir süre boyunca hiç veri gelmediyse sistem kendi kendine bir test isteği atabilir. Ayrıca log dosyalarını sadece hata olduğunda değil, düzenli aralıklarla kontrol eden bir yapı kurmakta fayda var. İkinci olarak disk kullanımını izleyen basit bir bash betiği yazıp bunu cron ile çalıştırabilirsin. Bu, sistemin dış kaynaklarını her zaman kontrol altında tutmanı sağlar. Son olarak, her zaman en kötü senaryoyu düşünerek kod yazmak gerekiyor. Site oturumu düşse ne olur, disk dolsa ne olur, internet kesilse ne olur gibi sorulara cevap veren bir mimari kurmalısın. Sessiz çalışan otomasyon çalışıyor demek değildir. Çıktı üretmiyorsa bunu hata saymayı öğrenmelisin. Bu bakış açısı, ileride kuracağın tüm sistemlerin daha sağlıklı çalışmasını sağlayacak. Şimdi git ve sistemindeki sessiz noktaları kontrol etmeye başla.





