חילוץ מרקטפלייס SSR בתעבורה גבוהה
עמודים נפלו לסירוגין, הזיכרון טיפס עד שהשרת מת — וריסטארט הפך לשיטת ההתמודדות. ככה זה תוקן.
- משך העבודה
- כ־10 חודשים, נמשכת
- תפקיד
- ייצוב פרודקשן ופרונטאנד
- סקאלה
- מרקטפלייס פרודקשן בתעבורה גבוהה
הבעיה
מרקטפלייס גדול נכשל בפרודקשן — ורק בפרודקשן. עמודים החזירו שגיאות לסירוגין, הזיכרון טיפס בהתמדה עד שהשרת מת, ואף אחד לא הצליח לאתר את הסיבה. הפתרון הזמני של הצוות היה להפעיל מחדש את השרתים לפני שהם קורסים.
דליפה שאי אפשר לשחזר לוקאלית לא מופיעה בקוד־ריוויו. היא מופיעה בשתיים בלילה, תחת תעבורה אמיתית, בדמות שרת מת.
מה עשיתי
ארבעה חלקי עבודה, בסדר שהסיכון הכתיב:
אבחון דליפת הזיכרון
פרופיילינג לאפליקציה הרצה תחת תעבורה דמוית־פרודקשן, השוואת heap snapshots לאורך זמן, ובידוד נתיב הקוד שהחזיק רפרנסים בחיים. ואז חיסול הדליפה — לא עקיפה שלה.
ייצוב ה־SSR תחת תעבורה אמיתית
בידוד שגיאות רינדור כך שעמוד אחד שנכשל לא מפיל את כל התהליך, וניקוי מצבי הכשל שמופיעים רק כשאלפי משתמשים פוגעים בשרת בו־זמנית.
הובלת מיגרציית בקאנד באפס דאונטיים
הפרונטאנד המשיך לשרת משתמשים בזמן שהבקאנד הוחלף מתחתיו — ישן וחדש רצים זה לצד זה, מעבר הדרגתי, ונתיב חזרה בכל שלב.
נשארתי כאחראי היציבות
העבודה לא נגמרה בתיקון. מאז אני מחזיק את יציבות הפרודקשן של האפליקציה באופן רציף — פיצ׳רים חדשים יוצאים בלי שחוסר היציבות הישן חוזר.
התוצאה
המספרים שחשובים כאן הם אלה שהפסיקו לקרות:
- צריכת זיכרון שטוחה — ריסטארטי החירום נעצרו לגמרי.
- נפילות העמודים לסירוגין נעלמו, תחת אותה תעבורה אמיתית שבעבר גרמה להן.
- מיגרציית הבקאנד הושלמה באפס דאונטיים — המשתמשים לא הרגישו. העבודה עדיין נמשכת, כ־10 חודשים — ההישארות היא ההמלצה.
סטאק
בלי שכתוב פריימוורק ובלי מעבר למשהו נוצץ — התיקון היה לגרום לסטאק ה־React/SSR הקיים להתנהג תחת עומס. זו בדרך כלל העבודה: הסטאק בסדר, ההתנהגות בפרודקשן לא.
נשמע מוכר מהאפליקציה שלך?
כל עבודה כאן התחילה אותו דבר: אפליקציה שכבר באוויר, ובעיה שמישהו החליט להפסיק לחיות איתה. האודיט הוא הדרך להתחיל בסיכון נמוך — גישת קריאה בלבד, דוח כתוב, ורשימת תיקונים מתועדפת.