Přeskočit na obsah
AutoValue
17. října 2026 · Data Quality

Týden, kdy jsme málem přišli o 84 000 inzerátů kvůli chybě, kterou jsme svalili na proxy servery

AutoValue Editorial
Týden, kdy jsme málem přišli o 84 000 inzerátů kvůli chybě, kterou jsme svalili na proxy servery

14. září

Na tenhle den jsme čekali týdny. Náš poskytovatel residenčních proxy serverů v červenci nečekaně vypadl kvůli problémům s platbou, a dva měsíce se stále větší část z našich 1,375 zdrojů procházela jen degradovaně, nebo vůbec – requesty vypršely, IP adresy se uprostřed session blokovaly, ten typ pomalého vykrvácení, které se neprojeví jako výpadek, ale jako zmenšující se číslo, kterého si nikdo nevšimne, dokud není ostuda hotová. Obnovili jsme pool. Nový, s 20 000 rotujícími residenčními session linkami, prověřili jsme každý exit node dřív, než se k čemukoli produkčnímu přiblížil. 100 % proběhlo bez problému. AE, DE, JP – všechno živé, všechno čisté.

Spustili jsme tedy supervidovaný crawl, takový, kde to někdo skutečně sleduje na dashboardu, místo aby jen věřil cronu. Čekal jsem přesný opak katastrofy.

Dostali jsme databázi, která při jediném průchodu ztratila 84 401 řádků, přičemž u 102 zdrojů klesl objem o více než 25 % oproti předchozímu snímku. Horší než dva měsíce proxy hladomoru, který jsme zrovna opravili.

Špatná teorie, stručně

Mým prvním instinktem – a k tomu se otevřeně přiznám – bylo, že nový pool je nějak horší, než ukázal test. Možná se session IP adresy během crawlu rate-limitovaly způsobem, který jednorázový test nezachytí. Je to rozumná teorie. Je ale také mylná, a víra v ni i na půl dne nás stála čas, který jsme nemohli ztrácet – crawl cron zůstává celou dobu takového ladění pozastavený, protože nechcete, aby špatný průchod přepsal dobrý snímek, zatímco ještě jen hádáte.

Signál, který tuhle teorii rozbil, byl dubizzle. Jeden z našich nejvytíženějších zdrojů v SAE si během toho běhu skutečně stáhl 32 595 inzerátů – naprosto zdravé číslo, proxy servery jasně fungovaly – a pak téměř všechny zahodil. Ne že by se je nepodařilo stáhnout. Stáhl je, a pak je vyhodil.

16. září: nalezení skutečné chyby

V tu chvíli to přestalo být příběhem o proxy serverech a stalo se příběhem o přepisování řádků. Naše persistenční vrstva při každém průchodu ukládá snímek každého zdroje jako úplný přepis <site>_cars_for_sale.csv – jen aktuální inzeráty, přepsat celou tabulku. To je správné chování, když crawl doběhne do konce. Je to katastrofické, když crawl v půlce vyprší a scraper zapíše to, co se mu podařilo stáhnout jako dílčí dávku, jako by to byl kompletní snímek. Zdroj, který běžně udržuje 9 000 živých inzerátů, se přepíše na 1 200, které stihl stáhnout před vypršením času, a zbývajících 7 800 zmizí – nikoli proto, že by se auta prodala, ale proto, že náš vlastní kód rozhodl, že nedokončený fetch je kompletní.

Proxy servery nás neobelhávaly. Problém byla retry logika, a byla tiše špatná už dlouho, jen to maskoval zdravější pool, který dřív stíhal dokončit fetche dřív, než na tenhle sweep vůbec došlo.

Tady je, co ten sweep skutečně stál, jakmile jsme to spočítali:

Starý retry sweepOpravený sweep
Pokusů na proxy31
Zpoždění mezi pokusy1s—
Efektivní strop na 50proxy poolu~56 minut na URL120sekundový celkový rozpočet
Chování při vypršenízapíše dílčí dávku jako plný snímekzdroj se vynechá, zachová se předchozí snímek

Padesát šest minut na to, aby se u jedné URL vzdal. Vynásobte to crawlem, který se dotýká více než tisíce zdrojů, a dostanete přesně ten typ tichého, nerovnoměrně rozloženého selhání, jaké jsme viděli – některé zdroje v pořádku, 102 z nich vykuchaných, a v logu nic, co by křičelo „výpadek proxy", protože technicky žádný nebyl.

25. září: oprava, a ta část, na které záleží vám

Patch, který vyšel devět dní později, udělal dvě nenápadné věci. Omezil retry matematiku tak, aby zaseklý fetch selhal rychle, místo aby sežral většinu hodiny, a – tohle je ta skutečně zásadní změna – dílčí fetch už nepřepisuje celou sadu řádků. Pokud zdroj stáhne jen 1 200 ze svých běžných 9 000 inzerátů, zachováme předchozí kompletní snímek, místo abychom ho přepsali zlomkem. Téhož dne přišla ještě druhá změna, která zapisuje viditelný příznak CRAWL_PAUSED, který náš monitoring zkontroluje dřív, než někomu poslídá hlášení o poklesu – takže záměrná pauza se čte jako pauza, ne jako alarm.

Proč by se o tohle všechno měl zajímat čtenář, který shání ojetou Hyundai? Protože štítky „pod trhem", které publikujeme – aktuálně jich je na webu živě 12 823 – jsou upřímné jen tehdy, pokud je kohorta, se kterou inzerát porovnáváme, skutečný, kompletní regionální trh, a ne útržek useknutý timeoutem. Štítek slevy postavený na snímku, který ztratil tři čtvrtiny srovnávací sady, není štítek slevy, je to šum v zeleném kabátku. Raději pozastavíme crawl na devět dní, než abychom tohle publikovali.

Dataset dnes čítá 1 108 535 inzerátů ve 73 regionech a 1,375 zdrojích – větší, než byl před tím, než tohle všechno začalo, s obnovenými proxy servery a uzavřenou chybou přepisování řádků. Ale číslo, ke kterému se stále vracím, není ten celkový součet. Je to 84 401 – rozdíl mezi crawlem, který na úrovni proxy serverů vypadal zdravě, a tím, který skutečně zdravý byl.

Data QualityWEB ScrapingCrawl ReliabilityBelow Market Deals
Sdílet

Související články