המונה ששינה את קטלוג המוצרים שלנו ל-502
משלוח
דף הקטלוג שמפרט את כל ערכות האוטומציה שאנחנו מוכרים החזיר לכל המבקרים 502 Bad Gateway במשך כ-41 שעות לאחר ההשקה. הדף של כל ערכת אוטומציה עבד, דף הבית עבד, התשלום עבד. החלק השבור היה כמה שורות שספרו צפיות בדפים.
הבאג
השרת של החנות שלנו סופר ביקורים בדפי ערכות אוטומציה. כדי לזהות לאיזו ערכת אוטומציה מיועד הבקשה, הוא לקח את החלק השני של הנתיב:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
עבור /kits/studio/ זה studio. עבור הקטלוג עצמו, /kits/, לנתיב יש שני לוכסים, כך שמנגנון ההגנה העביר אותו, אבל לאחר הסרת הלוכסים נשאר חלק אחד בלבד, ו-[1] העלה IndexError. ה-handler הוא http.server הסטנדרטי של Python: חריגה ב-do_GET סוגרת את החיבור ללא תשובה, ו-Cloudflare הציגה למבקר 502.
התיקון הוא פונקציה קטנה אחת שמחזירה מחרוזת ריקה כאשר החלק חסר. מונה הצפיות היה זקוק רק לשם של ערכת האוטומציה; הוא מעולם לא היה צריך להיות מסוגל לשבור את הדף שהוא סופר.
למה אף אחד מהבדיקות שלנו לא זיהה את זה
- שומר הסף לפעילות בדק דפי בית בלבד. דף הבית היה תקין.
- שלב ההשקה בדק כל ערכת אוטומציה שהופצה: את הדף שלה, את הפניית התשלום, ואת מסלול התשלום מקצה לקצה. הוא מעולם לא פתח את רשימת כל ערכות האוטומציה.
- האנליטיקה לא יכלה להציג את זה. הקוד שהיה אמור לספור את המבקרים בקטלוג הוא הקוד שהתקלקל. יומן השרת הכיל את התשובה כל הזמן: 17 tracebacks באותן 41 שעות, כל אחד מהם בקשה, מאדם או מ- crawler, שקיבלה שגיאה במקום את הדף.
מה השתנה
- כל דף, מבחוץ, כל שעה. משימה קטנה קוראת את מפת האתר ופותחת כל דף באנגלית ו, בתורה, אחד מ-42 השפות האחרות, דרך Cloudflare כמו מבקר. שני ריצות כושלות ברצף שולחות מייל; שחזור שולח מייל נוסף.
- שלב ההשקה פותח כל דף באנגלית לאחר שהוא בונה מחדש את האתר, וסרב לסיים אם אחד מהם לא החזיר 200.
- דפי אינדקס נספרים כדפים. הדפים שמפרטים דפים אחרים הם אלה שמבקר מגיע אליהם ראשון, והם היו אלה שאף אחד לא בדק.
המסקנה
עבודת צד בטיפול בבקשה, כגון ספירה, רישום יומן או מעקב, לעולם לא צריכה להכשיל את הבקשה, ובדיקת דפים שמכסה רק את הדפים ששיניתם לאחרונה מפספסת את אלה שמקשרים אליהם. השומר ב-Night Watch מקבל רשימה כלשהי של דפים, שכל אחד מהם חייב להכיל טקסט מסוים, ולא רק דפי בית.