Sticky Notes Warmup – פתרון ביצועים משולב
מבצע ”Sticky Notes Warmup“ מחולק לשני נדבכים משלימים: העלאת timeout מידית (מוכחת בשטח) וחימום אינדקסים לפני שה-process מקבל תעבורה (שיפור קוד שעדיין נבחן). המסמך מרכז את כל ההנחיות התפעוליות כך שהצוות ידע מה עובד ומה עדיין תחת מעקב.
רקע קצר
הנתיב /api/sticky-notes/reminders/summary נתקע כי _ensure_indexes() הופעל בכל בקשה וננעל על _db_lock.
בהיעדר warmup, כל worker ניסה לבנות אינדקסים מחדש בעת בקשת משתמש והוביל ל-timeouts.
התרופה המיידית (מוכחת)
העלאת timeout של Gunicorn ל־180 שניות פתרה מיד את התקיעות והחזירה את ה-WebApp להיות חד בכל הקלקה.
זהו קו ההגנה הראשון, גם אם חימום האינדקסים נחשב ”מאושר“ בהמשך.
export GUNICORN_CMD_ARGS="--timeout 180 --graceful-timeout 180"
Warmup מבני (עדיין בתהליך אימות)
בעת העלייה, אנחנו מפעילים warmup שמריץ את _ensure_indexes() פעם אחת (best-effort) ומסמן דגל גלובלי/Redis בשם
sticky_notes_indexes_ready_v1.ה-warmup רץ ברקע ולא אמור לחסום את השרת: ב-Wsgi/Flask הוא ירוץ ב-thread דמון, ואם הוא נקרא מתוך סביבת async עם event loop הוא ירוץ דרך executor כדי לא לתקוע את הלולאה.
כל בקשה בודקת את הדגל ורק אם הוא חסר מפעילה שוב את החימום, כך שנמנעים מנעילה חוזרת על _db_lock.
למרות שהקוד כבר נפרס, אין לנו עדיין נתוני פרודקשן שמוכיחים שהחימום לבדו מספיק, ולכן אסור להסיר את ה-timeout הנדיב.
איפוס הדגל בעת שינוי אינדקסים
עדכנתם אינדקס (שינוי שם, הוספה, הסרה) בקולקציית Sticky Notes? מחקו את המפתח.
אפשר להשתמש בפקודה:
redis-cli DEL sticky_notes_indexes_ready_v1
לחלופין, עדכנו את גרסת הדגל (למשל
sticky_notes_indexes_ready_v2) כדי לאלץ warmup.
מה לאמת לפני rollout מלא
להריץ rollout קטן או בדיקת staging ולוודא שהאירוע
sticky_indexes_warmupמופיע לכל worker עםstage=doneו-duration_ms(אידאלית פעם אחת לכל process).אם אתם רואים
stage=failedעם שגיאת DB (למשל אין חיבור למונגו בזמן עלייה) זה אומר שהחימום לא הצליח, אבל הוא עדיין נחשב best-effort ולא אמור להפיל את השרת — צריך לטפל בזמינות/הרשאות DB או להריץ ריטריי/rollout נוסף.למדוד latency אחרי ה-warmup ולוודא שלא חזרו timeouts.
לתעד ב-Postmortem האם הבעיה נפתרה ע“י timeout, warmup או שניהם.
מה לעשות אם latency קופץ שוב
לבדוק שה-environment כולל את ההגדרה
GUNICORN_CMD_ARGSמהקטע לעיל.לחפש בלוגים האירוע
sticky_indexes_warmup:stage=done: החימום הצליח (בדקו שזה לא חוזר בלולאה).stage=failed: החימום נכשל (לרוב DB לא זמין / הרשאות / timeout).היעדר אירוע: יכול להעיד שהדגל כבר קיים (לא בוצע warmup) או שהקוד לא הופעל בסביבת העלייה.
לאפס את
sticky_notes_indexes_ready_v1ולפקח מחדש על הלוגים.
המלצה רשמית
לשלב את שני הפתרונות תמיד: Timeout נדיב מכסה cold start איטי, והחימום מוריד את הסיכוי שניכנס שוב לנעילת אינדקסים.
אל תעדכנו את המסמכים החיצוניים או תכנית rollout לפני שקיימת הוכחה באחד הסביבות (Staging/Production Canary) שהלוג
sticky_indexes_warmupאכן רץ בהצלחה.