Szeptember 14.
Hetekig vártunk erre a napra. A rezidenciális proxy-szolgáltatónk még júliusban eltűnt egy számlázási hiba miatt, és két hónapon át az 1375 forrásunk egyre nagyobb hányada futott csak akadozva, vagy egyáltalán nem – lejárt lekérések, félbeszakadt session-ök közben kitiltott IP-k, az a fajta lassú vérveszteség, ami nem egy kiesésként jelenik meg, hanem egy folyton zsugorodó számként, amit senki nem vesz észre, amíg már nem válik zavaróvá. Megújítottuk. Új készlet, 20 000 rotáló rezidenciális session-sor, minden kilépési pontot leteszteltünk, mielőtt bármi közel kerülhetett volna az élő rendszerhez. A tesztek 100%-a átment. EAE, Németország, Japán – mind élő, mind tiszta.
Így lefuttattunk egy felügyelt crawlt, azt a fajtát, ahol valaki tényleg figyeli a műszerfalat, nem csak rábízza magát a cronra. Én az ellenkezőjét vártam egy katasztrófának.
Ehelyett egy olyan adatbázist kaptunk, amely egyetlen kör alatt 84 401 sort vesztett el, és 102 forrás esett 25%-nál nagyobb mértékben az előző pillanatkép alá. Rosszabb, mint a két hónapos proxy-éheztetés, amit épp most javítottunk ki.
A téves elmélet, röviden
Az első ösztönös gondolatom – és ezt nyíltan beismerem – az volt, hogy az új készlet valahogy rosszabb, mint amit a teszt sugallt. Talán a session IP-k a crawl közben kaptak rate limitet olyan módon, amit egy egyszeri teszt nem vesz észre. Ez egy ésszerű elmélet. De téves, és fél napig is hinni benne olyan időt vett el, amire nem volt ráérünk, mert a crawl cronja az egész idő alatt szünetel, amíg egy ilyen elméletet debuggolsz – nem akarsz egy rossz kört ráengedni egy jó pillanatkép fölé, amíg még csak tippelsz.
Az árulkodó jel, amely megtörte ezt az elméletet, a dubizzle volt. Az egyik legnagyobb forgalmú EAE-s forrásunk ebben a körben valójában 32 595 hirdetést lekért – tökéletesen egészséges szám, a proxyk nyilvánvalóan működtek –, majd ezek majdnem mindegyikét elvetette. Nem a lekérés hiúsult meg. Lekérte, majd eldobta.
Szeptember 16.: a valódi hiba megtalálása
Ekkortól szűnt meg proxy-sztori lenni, és vált sor-felülírási sztorivá. A mi perzisztencia-rétegünk minden forrást teljes felülírással pillanatképez le, a <site>_cars_for_sale.csv fájlban minden körben – csak az aktuális hirdetések, az egész táblát lecserélve. Ez helyes viselkedés, ha egy crawl végigfut. Ám katasztrofális, ha egy crawl félbeszakad lejárt idő miatt, és a scraper azt az esetlegesen összegyűjtött részleges adagot írja ki, mintha az lenne a teljes pillanatkép. Egy forrás, amely rendesen 9000 élő hirdetést tart, felülíródik az 1200-zal, amit az idő lejárása előtt sikerült lekérnie, és a maradék 7800 eltűnik – nem azért, mert a kocsik elkeltek, hanem mert a saját kódunk egy hiányos lekérést teljesnek hitt.
A proxyk nem hazudtak nekünk. Az újrapróbálkozási logika volt a probléma, és ez már hosszú ideje csendben rossz volt, csak egy egészségesebb készlet addig elfedte, amely korábban a lekéréseket a seprés előtt befejezte.
Íme, mibe került valójában ez a seprés, amikor leültünk számolni:
| Régi újrapróbálkozási seprés | Javított seprés | |
|---|---|---|
| Újrapróbálkozás proxyként | 3 | 1 |
| Késleltetés próbálkozásonként | 1s | — |
| Effektív felső határ egy 50-proxyból álló készletnél | ~56 perc / URL | 120 másodperces összköltség |
| Viselkedés időtúllépésnél | a részleges adagot teljes pillanatképként írja ki | a forrás kihagyva, az előző pillanatkép megmarad |
Ötvenhat perc, hogy feladjuk egyetlen URL-t. Szorozd meg ezt egy több mint ezer forrást érintő crawlon, és pontosan azt a csendes, egyenetlenül szóródó hibát kapod, amit láttunk – néhány forrás rendben, 102 kibelezve, és a logokban semmi, ami azt kiabálná, hogy „proxy-kiesés”, mert technikailag nem is volt az.
Szeptember 25.: a javítás, és az a rész, amely rád is vonatkozik
A kilenc nappal később kiadott javítás két kevésbé látványos dolgot tett. Beszabta az újrapróbálkozási matekot, hogy egy beragadt lekérés gyorsan bukjon el, ne egy óra nagy részét egye fel – és, ami igazán megakadályozza az adatvesztést –, egy részleges lekérés már nem cseréli le a teljes sorállományt. Ha egy forrás a szokásos 9000-ből csak 1200-at ér el, megtartjuk az előző teljes pillanatképet, helyette nem írjuk felül egy töredékkel. Ugyanazon a napon landolt egy második változás is, amely egy látható CRAWL_PAUSED jelzőt ír ki, amit a monitorozásunk ellenőriz, mielőtt bárkit riasztana egy visszaesés miatt – így egy tudatos szünet szünetként jelenik meg, nem riasztásként.
Miért érdekelje ez egy olvasót, aki épp egy használt Hyundait néz? Azért, mert a piaci ár alatti jelöléseink – amelyek ezen a héten 12 823 darabban élnek a weboldalon – csak akkor igazak, ha az a kohort, amivel egy hirdetést összehasonlítunk, a valódi, teljes regionális piac, nem pedig egy időtúllépés által megcsonkított töredéke annak. Egy olyan pillanatkép alapján épített ajánlat-jelölés, amely elvesztette az összehasonlítási halmaz háromnegyedét, nem ajánlat-jelölés, hanem zöld címkét viselő zaj. Inkább kilenc napra szüneteltetjük a crawlt, mint hogy ezt közzétegyük.
Az adatállomány ma 1 108 535 hirdetésnél áll, 73 régióban és 1375 forrásból – nagyobb, mint ennek az egésznek a kezdete előtt volt, a proxyk megújultak, és a sor-felülírási hiba is lezárva. De az a szám, amihez folyton visszatérek, nem az összesen. A 84 401 – a szakadék egy olyan crawl között, amely a proxyrétegen egészségesnek nézett ki, és egy olyan között, amely valóban az volt.



