İçeriğe atla
AutoValue
17 Ekim 2026 · Data Quality

Bir Hatayı Proxy'lere Yorduğumuz, Ama 84.000 İlanı Neredeyse Kaybettiğimiz Hafta

AutoValue Editorial
Bir Hatayı Proxy'lere Yorduğumuz, Ama 84.000 İlanı Neredeyse Kaybettiğimiz Hafta

14 Eylül

Bu günü haftalardır bekliyorduk. Konut tipi (residential) proxy sağlayıcımız Temmuz'da bir faturalandırma arızasıyla devre dışı kalmıştı ve iki aydır 1.375 kaynağımızın giderek büyüyen bir kısmı bozuk şekilde tarıyordu ya da hiç tarayamıyordu — isteklerin zaman aşımına uğraması, IP'lerin oturum ortasında engellenmesi; bir kesinti gibi görünmeyip kimsenin fark etmediği, utanç verici hale gelene kadar yavaşça küçülen bir sayı türünden yavaş bir kanama. Yenileme yaptık. Yeni havuz, 20.000 dönüşümlü (rotating) konut oturum satırı; prodüksiyona yaklaştırmadan önce her çıkışı test ettik. Testlerin %100'ü başarılı geçti. BAE, Almanya, Japonya — hepsi çalışıyordu, hepsi temizdi.

Bu yüzden gözetimli bir tarama çalıştırdık — birinin cron'a güvenmek yerine gerçekten gösterge panelini izlediği türden. Beklediğim, bir felaketin tam tersiydi.

Elimize geçen ise tek bir geçişte 84.401 satır kaybetmiş, 102 kaynağı önceki anlık görüntüsüne göre %25'ten fazla düşmüş bir veritabanı oldu. Az önce düzelttiğimiz iki aylık proxy kıtlığından daha kötüydü.

Yanlış teori, kısaca

İlk içgüdüm — ve bunu açıkça kabul edeceğim — yeni havuzun, testin gösterdiğinden bir şekilde daha kötü olduğuydu. Belki oturum IP'leri, tek seferlik bir testin yakalayamayacağı şekilde tarama ortasında hız sınırlamasına (rate limit) uğruyordu. Mantıklı bir teori. Aynı zamanda yanlış da — ve buna yarım gün bile inanmak, elimizde olmayan bir zamana mal oldu, çünkü böyle bir teoriyi hâlâ test ederken tarama cron'u duraklatılmış kalır — tahmin yürütürken kötü bir geçişin iyi bir anlık görüntünün üzerine yazmasını istemezsiniz.

Teoriyi çöken ipucu dubizzle'dı. En yüksek hacimli BAE kaynaklarımızdan biri olan bu kaynak, o çalışma sırasında aslında 32.595 ilan çekmişti — gayet sağlıklı bir sayı, proxy'ler açıkça çalışıyordu — ve sonra bunların neredeyse hepsini atmıştı. Çekemedi değil. Çekti, sonra attı.

16 Eylül: Asıl hatayı bulmak

İşte o noktada bu, bir proxy hikayesi olmaktan çıkıp bir satır-değiştirme (row-replacement) hikayesine dönüştü. Kalıcılık (persistence) katmanımız her kaynağı her geçişte <site>_cars_for_sale.csv dosyasının tam bir üzerine yazma işlemi olarak anlık görüntüler — sadece güncel ilanlar, tüm tabloyu değiştir. Bir tarama tamamlandığında bu doğru bir davranıştır. Ama bir tarama yarı yolda zaman aşımına uğradığında ve kazıyıcı (scraper) toplayabildiği her ne kısmi grup varsa onu sanki eksiksiz bir anlık görüntüymüş gibi yazdığında felakete dönüşür. Normalde 9.000 canlı ilan barındıran bir kaynak, süre bitmeden önce kazınan 1.200 ilanla üzerine yazılır ve diğer 7.800'ü ortadan kaybolur — arabalar satıldığı için değil, kendi kodumuz eksik bir çekimi tam bir çekimmiş gibi değerlendirdiği için.

Proxy'ler bize yalan söylemiyordu. Sorun yeniden deneme (retry) mantığıydı ve bu uzun süredir sessizce bozuktu; sadece süpürme işlemi önemli olmadan önce çekimleri bitirmeyi başaran daha sağlıklı bir havuz tarafından maskeleniyordu.

Aritmetiği yaptığımızda bu süpürmenin gerçekte neye mal olduğu şuydu:

Eski yeniden deneme süpürmesiDüzeltilmiş süpürme
Proxy başına yeniden deneme31
Deneme başına gecikme1sn—
50 proxy'lik havuzda etkin tavanURL başına ~56 dakikaToplamda 120 saniye bütçe
Zaman aşımındaki davranışkısmi grubu tam anlık görüntü olarak yazarkaynak atlanır, önceki anlık görüntü korunur

Tek bir URL'den vazgeçmek için elli altı dakika. Bunu binden fazla kaynağa dokunan bir taramada çarpın, karşınıza tam olarak gördüğümüz türden sessiz, eşit olmayan dağılımlı bir arıza çıkar — bazı kaynaklar iyi, 102'si tam anlamıyla boşaltılmış, günlüklerde (logs) "proxy kesintisi" diye bağıran hiçbir şey yok çünkü teknik olarak öyle bir şey yoktu.

25 Eylül: Düzeltme, ve sizi ilgilendiren kısım

Dokuz gün sonra yayına giren yama iki sıradan iş yaptı. Yeniden deneme aritmetiğine bir tavan koydu, böylece tıkanan bir çekim neredeyse bir saati yemek yerine hızlıca başarısız oluyor — ve veri kaybını gerçekten önleyen değişiklik bu: kısmi bir çekim artık tam satır kümesinin yerine geçmiyor. Bir kaynak alışılmış 9.000 ilanının yalnızca 1.200'üne ulaşabiliyorsa, önceki tam anlık görüntüyü bir kesirle üzerine yazmak yerine koruyoruz. Aynı gün, izleme sistemimizin birine bir düşüş hakkında bildirim göndermeden önce kontrol ettiği görünür bir CRAWL_PAUSED bayrağı yazan ikinci bir değişiklik devreye girdi — böylece kasıtlı bir duraklama bir uyarı olarak değil, bir duraklama olarak okunuyor.

İkinci el bir Hyundai arayan bir okuyucu bütün bunlarla neden ilgilenmeli? Çünkü yayınladığımız piyasa altı fiyat etiketleri — bu hafta itibarıyla sitede canlı olan 12.823 tanesi — bir ilanı karşılaştırdığımız kohortun gerçek, eksiksiz bölgesel pazar olup zaman aşımıyla kesilmiş bir parçası olmamasına bağlı olarak dürüsttür. Karşılaştırma kümesinin dörtte üçünü kaybetmiş bir anlık görüntüye karşı inşa edilmiş bir fırsat etiketi, fırsat etiketi değildir, yeşil renkli bir gürültüdür. Bunu yayınlamak yerine bir taramayı dokuz gün duraklatmayı tercih ederiz.

Bugün veri kümesi 73 bölgede ve 1.375 kaynakta 1.108.535 ilana ulaşmış durumda — bütün bunlar başlamadan önce olduğundan daha büyük, proxy'ler yenilenmiş ve satır-değiştirme hatası kapatılmış halde. Ama hep geri döndüğüm sayı toplam değil. 84.401 — proxy katmanında sağlıklı görünen bir tarama ile gerçekten sağlıklı olan bir tarama arasındaki fark.

Data QualityWEB ScrapingCrawl ReliabilityBelow Market Deals
Paylaş

İlgili yazılar