14. september
Na ta dan smo čakali tedne. Naš ponudnik rezidenčnih proxyjev je julija utihnil zaradi napake pri plačilu, in dva meseca je naraščajoč delež naših 1.375 virov poganjal pridobivanje podatkov degradirano ali pa sploh ni deloval — zahteve so potekale v časovno omejitev, IP-ji so se med sejo blokirali, tista vrsta počasnega krvavenja, ki se ne pokaže kot izpad, temveč kot krčeče se število, ki ga nihče ne opazi, dokler ni sramotno. Obnovili smo naročnino. Nov pool, 20.000 rotirajočih rezidenčnih sejnih linij, vsak izhod preverjen še pred približevanjem produkciji. 100 % preverjanja je bilo uspešnih. ZAE, Nemčija, Japonska — vse delujoče, vse čisto.
Zato smo izvedli nadzorovano pridobivanje podatkov, tisto vrsto, pri kateri nekdo dejansko spremlja nadzorno ploščo, namesto da bi zaupal cron opravilu. Pričakoval sem nasprotje katastrofe.
Dobili smo bazo podatkov, ki je v enem samem prehodu izgubila 84.401 vrstic, pri čemer je bilo 102 virov za več kot 25 % slabših od prejšnjega posnetka. Slabše kot dva meseca stradanja proxyjev, ki smo ga pravkar odpravili.
Napačna teorija, na kratko
Moj prvi vzgib — in to odkrito priznam — je bil, da je novi pool nekako slabši, kot je nakazovalo preverjanje. Morda so se seja IP-ji med pridobivanjem podatkov omejevali po hitrosti na način, ki ga enkratno preverjanje ne bi zaznalo. To je razumna teorija. Je pa tudi napačna, in že to, da smo vanjo verjeli pol dneva, nas je stalo časa, ki ga nismo imeli, saj cron opravilo za pridobivanje podatkov med razreševanjem takšne teorije ostane v premoru ves čas — ne želiš, da slab prehod prepiše dober posnetek, dokler še ugibaš.
Znak, ki je razbil to teorijo, je bil dubizzle. Eden naših najobsežnejših virov za ZAE je v tistem prehodu dejansko pridobil 32.595 oglasov — povsem zdravo število, proxyji so bili očitno delujoči — in nato skoraj vse zavrgel. Ne da jih ni uspel pridobiti. Pridobil jih je, in jih nato zavrgel.
16. september: iskanje dejanskega hrošča
Takrat se je zgodba prenehala vrteti okoli proxyjev in postala zgodba o nadomeščanju vrstic. Naš sloj za shranjevanje podatkov v vsakem prehodu posnameta vsak vir kot popoln prepis datoteke <site>_cars_for_sale.csv — samo trenutni oglasi, zamenjaj celotno tabelo. To je pravilno vedenje, ko se pridobivanje podatkov zaključi. Je pa katastrofalno, ko pridobivanje podatkov med potekom preseže časovno omejitev in strgalnik zapiše karkoli delnega paketa, ki ga je uspel zbrati, kot da bi bil to popoln posnetek. Vir, ki običajno vsebuje 9.000 aktivnih oglasov, se prepiše z 1.200, ki jih je strgalnik zbral, preden mu je potekel čas, in preostalih 7.800 izgine — ne ker bi se avtomobili prodali, temveč ker se je naša lastna koda odločila, da je nepopolna pridobitev popolna.
Proxyji nam niso lagali. Logika ponovnih poskusov je bila težava, in bila je tiho pokvarjena že dolgo, le prikrita s zdravejšim poolom, ki je zahteve nekoč dokončal, preden je ta pregled sploh postal pomemben.
Tole je dejanski strošek tega pregleda, ko smo opravili izračun:
| Stari pregled ponovnih poskusov | Popravljeni pregled | |
|---|---|---|
| Ponovni poskusi na proxy | 3 | 1 |
| Zamik med poskusi | 1 s | — |
| Učinkovita zgornja meja pri poolu 50 proxyjev | ~56 minut na URL | 120-sekundni skupni proračun |
| Vedenje ob preteku časa | zapiše delni paket kot popoln posnetek | vir se preskoči, ohrani se prejšnji posnetek |
Šestinpetdeset minut, da se obupa nad enim samim URL-jem. To pomnoži čez pridobivanje podatkov, ki zadeva več kot tisoč virov, in dobiš natanko tisto vrsto tihega, neenakomerno porazdeljenega odpovedovanja, ki smo ga videli — nekateri viri v redu, 102 jih je bilo oropanih, v dnevnikih pa nič ni vreščalo "izpad proxyja", ker ga tehnično ni bilo.
25. september: popravek, in del, ki je pomemben za vas
Popravek, ki je bil izdan devet dni pozneje, je naredil dve nebleščeči stvari. Omejil je matematiko ponovnih poskusov, tako da obtičala pridobitev odpove hitro namesto da požre skoraj uro, in — to je tisti, ki dejansko preprečuje izgubo podatkov — delna pridobitev ne nadomešča več celotnega niza vrstic. Če vir uspe pridobiti le 1.200 od svojih običajnih 9.000 oglasov, ohranimo prejšnji popoln posnetek, namesto da bi ga prepisali z delčkom. Istega dne je bila uvedena še druga sprememba, ki zapiše viden zastavico CRAWL_PAUSED, ki jo naš nadzor preveri, preden kogarkoli obvesti o upadu — tako se namerna premor prebere kot premor, ne kot alarm.
Zakaj bi bralcu, ki kupuje rabljeni Hyundai, bilo kaj od tega pomembno? Ker so oznake pod tržno ceno, ki jih objavljamo — 12.823 jih je ta teden aktivnih na spletni strani — poštene le, če je kohorta, s katero primerjamo oglas, resničen, popoln regionalni trg in ne fragment, okrajšan zaradi poteka časovne omejitve. Oznaka za ugodno ponudbo, zgrajena na posnetku, ki je izgubil tri četrtine primerjalnega nabora, ni oznaka za ugodno ponudbo, je šum z zeleno nalepko. Raje bomo pridobivanje podatkov premorili za devet dni, kot da bi objavili to.
Nabor podatkov danes obsega 1.108.535 oglasov iz 73 regij in 1.375 virov — večji, kot je bil pred vsem tem, proxyji obnovljeni in hrošč z nadomeščanjem vrstic odpravljen. Toda številka, k kateri se vedno znova vračam, ni skupno število. Je 84.401 — razkorak med pridobivanjem podatkov, ki je bilo videti zdravo na ravni proxyjev, in tistim, ki je to dejansko bilo.



