شمارنده بازدید که کاتالوگ ما را به 502 تبدیل کرد
ارسال
صفحهای که همه کیتهایی که میفروشیم را فهرست میکند، حدود 41 ساعت پس از راهاندازی به هر بازدیدکننده با 502 Bad Gateway پاسخ میداد. صفحه هر کیت بهتنهایی کار میکرد، صفحه اصلی کار میکرد، پرداخت کار میکرد. بخش خراب، چند خطی بود که بازدیدهای صفحه را میشمرد.
باگ
سرور فروشگاه ما بازدیدهای صفحات کیتها را میشمارد. برای یافتن اینکه درخواست مربوط به کدام کیت است، بخش دوم مسیر را برمیداشت:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
برای /kits/studio/ این مقدار studio است. برای خود کاتالوگ، یعنی /kits/، مسیر دو اسلش دارد، بنابراین محافظ اجازه عبور میداد، اما پس از حذف اسلشها تنها یک بخش باقی میماند و [1] خطای IndexError ایجاد میکرد. هندلر، http.server استاندارد پایتون است: یک استثنا در do_GET اتصال را بدون پاسخ میبندد و Cloudflare به بازدیدکننده 502 نشان میداد.
راهحل، یک تابع کوچک است که در صورت نبودِ بخش مورد نظر، رشته خالی برمیگرداند. شمارنده بازدید تنها به نام کیت نیاز داشت؛ هرگز نباید میتوانست صفحهای را که میشمرد، خراب کند.
چرا هیچیک از بررسیهای ما آن را ندید
- واچداگ پایداری فقط صفحههای اصلی را باز میکرد. صفحه اصلی سالم بود.
- مرحله انتشار هر کیتی را که عرضه میکرد بررسی میکرد: صفحه آن، تغییر مسیر پرداخت، و مسیر پرداخت را از ابتدا تا انتها. هرگز فهرست همه کیتها را باز نمیکرد.
- تحلیلها نمیتوانستند آن را نشان دهند. کدی که باید بازدیدکنندگان کاتالوگ را میشمرد، همان کدی بود که کرش میکرد. لاگ سرور از ابتدا پاسخ را داشت: 17 traceback در آن 41 ساعت، هر کدام یک درخواست، از یک نفر یا یک خزنده، که بهجای صفحه، خطا دریافت میکرد.
چه چیزی تغییر کرد
- هر صفحه، از بیرون، هر ساعت. یک کار کوچک sitemap را میخواند و هر صفحه انگلیسی و بهنوبت یکی از 42 زبان دیگر را، از طریق Cloudflare مانند یک بازدیدکننده، باز میکند. دو اجرای ناموفق پشتسرهم یک ایمیل ارسال میکند؛ بازیابی هم ایمیل دیگری میفرستد.
- مرحله انتشار هر صفحه انگلیسی را باز میکند پس از بازسازی سایت، و اگر یکی پاسخ 200 ندهد، اجازه اتمام نمیدهد.
- صفحههای فهرست، صفحه محسوب میشوند. صفحههایی که سایر صفحهها را فهرست میکنند، همانهایی هستند که بازدیدکننده ابتدا به آنها میرسد، و همانهایی بودند که کسی آنها را آزمایش نکرده بود.
نکته کلیدی
کارهای جانبی در یک هندلر درخواست، مانند شمارش، ثبت رویدادها یا ردیابی، هرگز نباید باعث شکست درخواست شوند؛ و بررسی صفحهای که فقط صفحات تازه تغییریافته را پوشش میدهد، آنهایی را که به این صفحات لینک دارند از قلم میاندازد. واچداگ موجود در Night Watch هر فهرستی از صفحات را میپذیرد که هرکدام باید شامل متنی مشخص باشند، نه فقط صفحههای اصلی.