عدّاد المشاهدات الذي حوّل كتالوجنا إلى خطأ 502
الشحن
أجابت الصفحة التي تعرض كل الحزم التي نبيعها على كل زائر بخطأ 502 Bad Gateway لمدة 41 ساعة تقريبًا بعد الإطلاق. كانت صفحة كل حزمة تعمل، والصفحة الرئيسية تعمل، وإتمام الشراء يعمل. الجزء المعطوب كان بضعة أسطر تعدّ مشاهدات الصفحات.
الخلل
يعدّ خادم متجرنا الزيارات إلى صفحات الحزم. لمعرفة الحزمة التي يخصها الطلب، كان يأخذ الجزء الثاني من المسار:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
بالنسبة إلى /kits/studio/ يكون الجزء هو studio. أما بالنسبة إلى الكتالوج نفسه، /kits/، فيحتوي المسار على شرطة مائلة مزدوجة، لذا سمح له الحارس بالمرور، لكن بعد إزالة الشرطات المائلة يبقى جزء واحد فقط، فيرفع [1] خطأ IndexError. المعالج هو http.server القياسي في Python: أي استثناء في do_GET يغلق الاتصال دون إجابة، فيعرض Cloudflare للزائر خطأ 502.
الإصلاح هو دالة صغيرة واحدة تُرجع نصًا فارغًا عندما يكون الجزء مفقودًا. كان عدّاد المشاهدات يحتاج فقط إلى اسم الحزمة؛ ولم يكن يحتاج أبدًا إلى أن يكسر الصفحة التي يعدّها.
لماذا لم تلتقطه أي من فحوصاتنا
- كان مراقب التشغيل يفتح الصفحات الرئيسية فقط. كانت الصفحة الرئيسية سليمة.
- كانت خطوة الإصدار تفحص كل حزمة تُطرح: صفحتها، وإعادة توجيه إتمام الشراء الخاصة بها، والمسار المدفوع من البداية إلى النهاية. لكنها لم تفتح أبدًا قائمة كل الحزم.
- لم تستطع التحليلات إظهاره. الكود الذي كان سيعدّ زوار الكتالوج هو نفسه الكود الذي تعطل. كان سجل الخادم يحمل الإجابة طوال الوقت: 17 أثرًا استثنائيًا في تلك الـ 41 ساعة، كل واحد منها طلب، من شخص أو من زاحف، حصل على خطأ بدلاً من الصفحة.
ما الذي تغيّر
- كل صفحة، من الخارج، كل ساعة. مهمة صغيرة تقرأ خريطة الموقع وتفتح كل صفحة بالإنجليزية، وواحدة من اللغات الـ 42 الأخرى بالتناوب، عبر Cloudflare مثل الزائر. يرسل فشل تشغيلين متتاليين بريدًا إلكترونيًا؛ ويرسل التعافي بريدًا آخر.
- تفتح خطوة الإصدار كل صفحة بالإنجليزية بعد إعادة بناء الموقع، وترفض الانتهاء إذا لم تستجب إحداها برمز 200.
- تُحسب صفحات الفهرس كصفحات. الصفحات التي تعرض صفحات أخرى هي أول ما يصل إليه الزائر، وهي الصفحات التي لم يختبرها أحد.
الخلاصة
الأعمال الجانبية داخل معالج الطلبات، مثل العدّ أو التسجيل أو التتبّع، يجب ألّا تُفشل الطلب أبدًا، كما أنّ فحص الصفحات الذي يقتصر على الصفحات التي غيّرتها للتوّ يفوّت تلك التي ترتبط بها. يراقب Night Watch أيّ قائمة من الصفحات، بحيث تحتوي كلٌّ منها على النصّ المطلوب، وليس الصفحات الرئيسية فحسب.