عدّاد المشاهدات الذي حوّل كتالوجنا إلى خطأ 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.

الإصلاح هو دالة صغيرة واحدة تُرجع نصًا فارغًا عندما يكون الجزء مفقودًا. كان عدّاد المشاهدات يحتاج فقط إلى اسم الحزمة؛ ولم يكن يحتاج أبدًا إلى أن يكسر الصفحة التي يعدّها.

لماذا لم تلتقطه أي من فحوصاتنا

ما الذي تغيّر

الخلاصة

الأعمال الجانبية داخل معالج الطلبات، مثل العدّ أو التسجيل أو التتبّع، يجب ألّا تُفشل الطلب أبدًا، كما أنّ فحص الصفحات الذي يقتصر على الصفحات التي غيّرتها للتوّ يفوّت تلك التي ترتبط بها. يراقب Night Watch أيّ قائمة من الصفحات، بحيث تحتوي كلٌّ منها على النصّ المطلوب، وليس الصفحات الرئيسية فحسب.

محدّث: