تخطٍّ إلى المحتوى
AutoValue
17 أكتوبر 2026 · Data Quality

الأسبوع الذي كدنا نخسر فيه 84,000 إعلان بسبب خلل حمّلنا الوكيل البديل مسؤوليته

AutoValue Editorial
الأسبوع الذي كدنا نخسر فيه 84,000 إعلان بسبب خلل حمّلنا الوكيل البديل مسؤوليته

14 سبتمبر

قضينا أسابيع في انتظار هذا اليوم. مزوّد الوكلاء البديلين السكنيين (residential proxies) الذي نتعامل معه كان قد تعطّل بسبب فشل في الفوترة منذ يوليو، وطوال شهرين كانت نسبة متزايدة من مصادرنا البالغة 1,375 مصدرًا تُزحف بشكل متدهور أو لا تُزحف أصلًا — طلبات تنتهي بمهلة زمنية، عناوين IP تُحظر في منتصف الجلسة، ذلك النوع من النزيف البطيء الذي لا يظهر كعطل واضح بل كعدد يتقلّص دون أن يلاحظه أحد إلى أن يصبح الأمر محرجًا. جدّدنا الاشتراك. مجمّع جديد، 20,000 خط جلسة سكني دوّار، تم فحص كل مخرج قبل تقريبه من بيئة الإنتاج. 100% من الفحوصات نجحت. AE وDE وJP — كلها تعمل، كلها نظيفة.

فشغّلنا عملية زحف تحت الملاحظة المباشرة، من النوع الذي يراقب فيه أحدهم لوحة البيانات بالفعل بدلًا من الاعتماد على المهمة المجدولة (cron). كنت أتوقع عكس الكارثة تمامًا.

ما حصلنا عليه كان قاعدة بيانات خسرت 84,401 سجلًا في عملية واحدة، مع 102 مصدرًا انخفضت بنسبة تزيد عن 25% عن لقطتها (snapshot) السابقة. أسوأ من شهرين التجويع في الوكلاء البديلين الذي كنا قد أصلحناه للتو.

النظرية الخاطئة، باختصار

أول حدس لديّ — وسأتحمّل مسؤولية هذا بصراحة — كان أن المجمّع الجديد أسوأ بطريقة ما مما أظهره الفحص. ربما كانت عناوين IP الخاصة بالجلسات تتعرض لتقييد المعدل (rate-limiting) في منتصف عملية الزحف بطريقة لا يكشفها فحص لمرة واحدة. إنها نظرية معقولة. وهي أيضًا خاطئة، والإيمان بها حتى لنصف يوم كلّفنا وقتًا لم نكن نملكه، لأن مهمة الزحف المجدولة تبقى متوقفة طوال فترة تصحيحك لنظرية كهذه — فأنت لا تريد لعملية سيئة أن تطمس لقطة جيدة بينما لا تزال تخمّن.

العلامة التي كشفت خطأ النظرية كانت dubizzle. أحد أعلى مصادرنا من حيث الحجم في الإمارات، وقد جلب فعليًا 32,595 إعلانًا خلال تلك الدورة — رقم صحي تمامًا، والوكلاء البديلون يعملون بوضوح — ثم تخلّى عن معظمها تمامًا. لم تفشل عملية الجلب. بل جُلبت، ثم رُميت.

16 سبتمبر: العثور على الخلل الحقيقي

عند تلك النقطة توقفت القصة عن كونها قصة وكلاء بديلين وأصبحت قصة استبدال سجلات. طبقة التخزين لدينا تأخذ لقطة لكل مصدر بالاستبدال الكامل لملف <site>_cars_for_sale.csv في كل دورة — الإعلانات الحالية فقط، استبدال الجدول كله. هذا سلوك صحيح عندما تكتمل عملية الزحف. لكنه كارثي عندما تنتهي مهلة عملية الزحف في منتصف الطريق، فيكتب جامع البيانات أي حزمة جزئية تمكّن من جمعها كما لو كانت اللقطة الكاملة. مصدر يحمل عادةً 9,000 إعلان نشط يُستبدل بالـ1,200 التي تمكّن من جمعها قبل انتهاء الوقت، وتختفي الـ7,800 الباقية — ليس لأن السيارات بيعت، بل لأن كودنا الخاص قرر أن عملية جلب غير مكتملة هي عملية جلب كاملة.

الوكلاء البديلون لم يكونوا يكذبون علينا. منطق إعادة المحاولة كان هو المشكلة، وكان سيئًا بصمت منذ وقت طويل، لكنه كان مُقنَّعًا بمجمّع أكثر صحة كان يُنهي عمليات الجلب قبل أن يصبح المسح الدوري (sweep) مهمًا.

وهذا ما كلّفنا فعليًا ذلك المسح الدوري، بعد أن أجرينا الحساب:

مسح إعادة المحاولة القديمالمسح المُصحَّح
عدد إعادات المحاولة لكل وكيل بديل31
التأخير في كل محاولة1 ثانية—
السقف الفعلي عبر مجمّع من 50 وكيلًا بديلًا~56 دقيقة لكل رابط (URL)موازنة إجمالية بـ120 ثانية
السلوك عند انتهاء المهلةيكتب الحزمة الجزئية كلقطة كاملةيُتخطّى المصدر، وتُحفظ اللقطة السابقة

ستة وخمسون دقيقة للتخلي عن رابط واحد فقط. اضرب ذلك على عملية زحف تطال أكثر من ألف مصدر وستحصل بالضبط على ذلك النوع من الفشل الصامت وغير المتوازع الذي رأيناه — بعض المصادر سليمة، و102 منها أُفرغت، ولا شيء في السجلّات يصرخ "انقطاع في الوكلاء البديلين" لأنه، تقنيًا، لم يكن هناك انقطاع.

25 سبتمبر: الإصلاح، والجزء الذي يهمّك

الترقيع الذي صدر بعد تسعة أيام قام بأمرين غير مبهرين. فرض سقفًا على حساب إعادة المحاولة بحيث تفشل عملية الجلب العالقة بسرعة بدلًا من استهلاك معظم ساعة، و- وهذا هو الأمر الذي يمنع فعليًا خسارة البيانات - عملية الجلب الجزئية لا تستبدل مجموعة السجلات الكاملة بعد الآن. إذا تمكّن مصدر من جلب 1,200 فقط من إعلاناته المعتادة البالغة 9,000، فإننا نحتفظ باللقطة الكاملة السابقة بدلًا من استبدالها بجزء منها. في اليوم نفسه، صدر تغيير ثانٍ يكتب علامة CRAWL_PAUSED ظاهرة يتحقق منها نظام المراقبة لدينا قبل أن ينبّه أي شخص بشأن انخفاض ما — بحيث يُقرأ التوقف المتعمد كتوقف، لا كتنبيه.

لماذا يجب أن يهتم قارئ يبحث عن سيارة هيونداي مستعملة بأي من هذا؟ لأن علامات "أقل من السوق" التي ننشرها — 12,823 منها نشطة على الموقع حتى هذا الأسبوع — لا تكون صادقة إلا إذا كانت المجموعة (cohort) التي نقارن بها الإعلان هي السوق الإقليمي الحقيقي والكامل، وليست جزءًا مقطوعًا بسبب انتهاء مهلة. علامة "صفقة" مبنية على لقطة خسرت ثلاثة أرباع مجموعة المقارنة الخاصة بها ليست علامة صفقة، بل ضجيج يرتدي تسمية خضراء. نفضّل إيقاف عملية الزحف لتسعة أيام على نشر ذلك.

تقف قاعدة البيانات اليوم عند 1,108,535 إعلانًا عبر 73 منطقة و1,375 مصدرًا — أكبر مما كانت عليه قبل أن يبدأ أي من هذا، بعد تجديد الوكلاء البديلين وإغلاق خلل استبدال السجلات. لكن الرقم الذي أعود إليه دائمًا ليس الإجمالي. إنه 84,401 — الفارق بين عملية زحف بدت سليمة على مستوى طبقة الوكلاء البديلين وعملية كانت سليمة فعليًا.

Data QualityWEB ScrapingCrawl ReliabilityBelow Market Deals
مشاركة

مقالات ذات صلة