پرش به محتوا
AutoValue
۲۵ مهر ۱۴۰۵ · Data Quality

هفته‌ای که نزدیک بود ۸۴٬۰۰۰ آگهی را به خاطر باگی که گردن پراکسی‌ها انداختیم از دست بدهیم

AutoValue Editorial
هفته‌ای که نزدیک بود ۸۴٬۰۰۰ آگهی را به خاطر باگی که گردن پراکسی‌ها انداختیم از دست بدهیم

۱۴ سپتامبر

هفته‌ها منتظر این روز بودیم. ارائه‌دهنده‌ی پراکسی رزیدنشیال ما از ماه جولای به‌خاطر یک نقص در صورت‌حساب از کار افتاده بود، و طی دو ماه بخش رو‌به‌رشدی از ۱٬۳۷۵ منبع ما به‌صورت تضعیف‌شده کراول می‌شدند یا اصلاً کراول نمی‌شدند — درخواست‌هایی که با تایم‌اوت مواجه می‌شدند، آی‌پی‌هایی که وسط سشن بلاک می‌شدند؛ همان نوع خونریزی آهسته‌ای که به شکل یک قطعی کامل بروز نمی‌کند، بلکه به‌صورت عددی رو‌به‌کاهش است که کسی متوجهش نمی‌شود تا وقتی که شرم‌آور شود. ما تمدید کردیم. استخر جدید، ۲۰٬۰۰۰ خط سشن رزیدنشیال چرخشی، که پیش از نزدیک‌شدن به محیط عملیاتی هر خروجی آن را آزمایش کردیم. ۱۰۰٪ از آزمایش‌ها موفق بود. امارات، آلمان، ژاپن — همه فعال، همه تمیز.

پس یک کراول تحت نظارت اجرا کردیم، از آن نوعی که واقعاً کسی داشبورد را زیر نظر دارد نه این‌که به کرون اعتماد کند. انتظار داشتم دقیقاً برعکسِ یک فاجعه رخ دهد.

چیزی که گرفتیم پایگاه داده‌ای بود که در یک پاس واحد ۸۴٬۴۰۱ ردیف را از دست داده بود، با ۱۰۲ منبع که بیش از ۲۵٪ نسبت به اسنپ‌شات قبلی‌شان افت کرده بودند. بدتر از دو ماه گرسنگی پراکسی که تازه رفعش کرده بودیم.

نظریه‌ی غلط، به‌اختصار

اولین واکنش من — و این را صادقانه می‌پذیرم — این بود که استخر جدید به‌نحوی بدتر از چیزی بود که آزمایش نشان داده بود. شاید آی‌پی‌های سشن وسط کراول به شکلی ریت‌لیمیت می‌شدند که یک آزمایش یک‌باره آن را نمی‌دید. نظریه‌ی معقولی است. اما غلط هم هست، و باور داشتن به آن حتی برای نیم روز، زمانی را از ما گرفت که نداشتیم، چون کرون کراول در تمام مدتی که دارید نظریه‌ای از این دست را دیباگ می‌کنید متوقف می‌ماند — نمی‌خواهید یک پاسِ بد، اسنپ‌شات خوب را بازنویسی کند درحالی‌که هنوز دارید حدس می‌زنید.

نشانه‌ای که این نظریه را شکست، dubizzle بود. یکی از پرحجم‌ترین منابع ما در امارات، که در آن اجرا واقعاً ۳۲٬۵۹۵ آگهی واکشی کرده بود — عددی کاملاً سالم که نشان می‌داد پراکسی‌ها بدون مشکل کار می‌کنند — و بعد تقریباً همه‌ی آن‌ها را دور ریخته بود. نه این‌که واکشی ناموفق بوده باشد. واکشی شده بود، و سپس دور ریخته شده بود.

۱۶ سپتامبر: پیدا کردن باگ واقعی

از همین‌جا بود که ماجرا دیگر یک داستان پراکسی نبود و تبدیل شد به یک داستان جایگزینی ردیف‌ها. لایه‌ی پایداری‌سازی ما در هر پاس، هر منبع را با یک بازنویسی کامل روی <site>_cars_for_sale.csv اسنپ‌شات می‌گیرد — فقط آگهی‌های جاری، جایگزینی کل جدول. این رفتار وقتی یک کراول کامل تمام می‌شود درست است. اما وقتی کراول در میانه‌ی راه با تایم‌اوت مواجه می‌شود و اسکرپر هر دسته‌ی ناقصی را که توانسته جمع‌آوری کند انگار که اسنپ‌شات کامل باشد می‌نویسد، فاجعه‌بار است. منبعی که معمولاً ۹٬۰۰۰ آگهی زنده دارد، با همان ۱٬۲۰۰ موردی که پیش از تمام‌شدن زمان اسکرپ کرده جایگزین می‌شود، و ۷٬۸۰۰ موردِ دیگر ناپدید می‌شوند — نه به این خاطر که ماشین‌ها فروخته شده باشند، بلکه چون کد خودمان تصمیم گرفته بود یک واکشیِ ناقص را کامل تلقی کند.

پراکسی‌ها به ما دروغ نمی‌گفتند. منطق تلاش مجدد (retry) مشکل بود، و مدت‌ها بود که به‌شکلی خاموش خراب بود، فقط به لطف استخر سالم‌تر قبلی که معمولاً پیش از این‌که این حلقه‌ی تلاش مجدد اهمیت پیدا کند واکشی‌ها را تمام می‌کرد، پنهان مانده بود.

این‌هم حاصل محاسبه‌ی واقعی هزینه‌ی آن حلقه‌ی تلاش مجدد:

حلقه‌ی تلاش مجدد قدیمیحلقه‌ی اصلاح‌شده
تلاش مجدد به ازای هر پراکسی۳۱
تأخیر در هر تلاش۱ ثانیه—
سقف مؤثر در کل یک استخر ۵۰-پراکسیحدود ۵۶ دقیقه به ازای هر URLبودجه‌ی کلی ۱۲۰ ثانیه
رفتار هنگام تایم‌اوتدسته‌ی ناقص را به‌عنوان اسنپ‌شات کامل می‌نویسدمنبع رد می‌شود، اسنپ‌شات قبلی حفظ می‌شود

۵۶ دقیقه برای این‌که از یک URL واحد صرف‌نظر شود. این را در کراولی که بیش از هزار منبع را لمس می‌کند ضرب کنید، دقیقاً همان نوع شکست خاموش و نامتوازن را می‌گیرید که ما دیدیم — برخی منابع سالم، ۱۰۲ تای آن‌ها داغان، و هیچ‌چیز در لاگ‌ها که فریاد بزند «قطعی پراکسی»، چون در واقع، از نظر فنی، قطعی‌ای وجود نداشت.

۲۵ سپتامبر: راه‌حل، و بخشی که برای شما اهمیت دارد

پچی که نه روز بعد منتشر شد دو کار بی‌هیاهو انجام داد. اول، سقف محاسبه‌ی تلاش مجدد را محدود کرد تا یک واکشی گیرکرده سریع شکست بخورد به‌جای این‌که بیشتر یک ساعت را ببلعد؛ و — این همان چیزی‌ست که واقعاً از از‌دست‌رفتن داده جلوگیری می‌کند — یک واکشی ناقص دیگر مجموعه‌ی کامل ردیف‌ها را جایگزین نمی‌کند. اگر یک منبع فقط ۱٬۲۰۰ تا از ۹٬۰۰۰ آگهی معمول خود را واکشی کند، اسنپ‌شات کامل قبلی را حفظ می‌کنیم به‌جای این‌که آن را با یک کسر جایگزین کنیم. همان روز، تغییر دومی هم اعمال شد که یک پرچم قابل‌مشاهده به نام CRAWL_PAUSED می‌نویسد که سیستم مانیتورینگ ما پیش از این‌که درباره‌ی یک افت به کسی پیجر بزند آن را بررسی می‌کند — پس یک توقف عمدی به‌عنوان توقف خوانده می‌شود، نه به‌عنوان هشدار.

چرا باید خواننده‌ای که دنبال یک هیوندای دست‌دوم می‌گردد به هیچ‌کدام از این‌ها اهمیت بدهد؟ چون نشان‌های زیر-قیمت-بازار که منتشر می‌کنیم — ۱۲٬۸۲۳ تای آن‌ها تا همین هفته روی سایت فعال‌اند — فقط زمانی صادقانه‌اند که دسته‌ی (cohort) مقایسه‌شده با یک آگهی، واقعاً بازار منطقه‌ای کامل باشد نه قطعه‌ای بریده‌شده به‌خاطر تایم‌اوت. یک نشان «معامله‌ی خوب» که بر پایه‌ی اسنپ‌شاتی ساخته شده باشد که سه‌چهارم مجموعه‌ی مقایسه‌اش را از دست داده، نشان معامله نیست، نویزی‌ست با برچسب سبز. ما ترجیح می‌دهیم نه روز یک کراول را متوقف کنیم تا این را منتشر کنیم.

مجموعه‌داده امروز در ۱٬۱۰۸٬۵۳۵ آگهی در ۷۳ منطقه و ۱٬۳۷۵ منبع قرار دارد — بزرگ‌تر از پیش از شروع همه‌ی این ماجرا، با پراکسی‌های تمدیدشده و باگ جایگزینی ردیف‌ها رفع‌شده. اما عددی که همچنان ذهنم را درگیر می‌کند مجموع کل نیست. ۸۴٬۴۰۱ است — فاصله‌ی میان کراولی که در لایه‌ی پراکسی سالم به‌نظر می‌رسید و کراولی که واقعاً سالم بود.

Data QualityWEB ScrapingCrawl ReliabilityBelow Market Deals
اشتراک‌گذاری

مقالات مرتبط