
שופיפיי עברה מ-Redis ל-MySQL לשריון מלאי — והמערכת עמדה בעומס
שופיפיי העבירה את ההגנה מפני מכירת יתר מ-Redis ל-MySQL, ובנתה את השריונות מחדש על SKIP LOCKED ועל שורה לכל יחידת מלאי. הלקח המרכזי: צוואר הבקבוק היה בחיבורים, לא במעבד.
שופיפיי החליפה את המערכת מבוססת Redis שמונעת מכירת יתר בפתרון שנשען על תכונת SKIP LOCKED של MySQL 8, ולטענת החברה המערכת עמדה ביעדי התפוקה הגבוהים שלה בשיא העומס של 2025. על הפרויקט כתבה המהנדסת אמילי נואל.
למה השיטה הישנה קרסה
ההגנה מפני מכירת יתר מורכבת משני שלבים: שריון — החזקה קצרה שנוצרת עם תחילת התשלום — ואישור, שמנכה לצמיתות את היחידה מספר המלאי לאחר שהתשלום מצליח. קודם לכן נשמרו השריונות ב-Redis, שם שריון פירושו הקטנת מפתח ושחרור פירושו הגדלתו. Redis התמודד היטב עם מקביליות, אבל השריונות וספר המלאי ישבו בשתי מערכות נפרדות, כך ששלב האישור חייב לעדכן את MySQL ולנקות את Redis, ושתי הפעולות הללו לא יכלו להיכלל בצעד אטומי אחד. בהתאם לסדר, הדבר עלול היה לגרום למכירת יתר או למכירת חסר, והמודל גם לא הכיר מלאי במספר מיקומים.
שורה לכל יחידה, במאגר מוגבל
התכנון החדש שומר שורה לכל יחידה שאפשר למכור, ולא שורה לכל פריט עם עמודת כמות: פריט עם עשר יחידות מקבל עשר שורות, וכך השריונות חולקים טרנזקציות ACID עם ספר המלאי. מכיוון שפריט עם 50,000 יחידות במיקומים שונים היה יוצר 500,000 שורות, הצוות מחזיק מאגר מוגבל של שורות פנויות, עד 1,000 לכל צירוף פריט-מיקום, שאותו ממלא תהליך חידוש מתוך ספר המלאי. אם מבצע בזק מרוקן את המאגר, החידוש רץ במקום מאחורי מנעול, כך ששריונות מקבילים ממתינים במקום להתחרות על הכנסת שורות.
כיוונון נעילות ואיתור המגבלה האמיתית
כמה פרטים התבררו כקריטיים. מפתח ראשי מורכב על העמודות שלפיהן מסננים צמצם את נעילת השורות משתי נעילות לאחת لكل שריון. מעבר הטרנזקציות לרמת הבידוד READ COMMITTED מנע את נעילות ה-gap, כולל על רשומת supremum, שחסמו את החידוש. סדר נעילה אחיד ביטל מבוי סתום בין השריון לאישור, וקיבוץ שאילתות ב-UNION ALL צמצם את מספר הפניות למסד עבור עגלות עם כמה פריטים.
צוואר הבקבוק הצפוי לא הופיע. המעבד היה רחוק מרוויה והשאילתות כבר היו מכווננות, ובכל זאת הצוות נתקל בתקרה: החיבורים למסד נגמרו בגלל חלקים אחרים במסלול התשלום. תיוג כל שאילתה לפי התהליך העסקי שהפעיל אותה וצבירת זמני החזקת החיבורים בשכבת ProxySQL הראו מי צורך את מרבית זמן החיבור. ניקוי מסלול התשלום הסיר 50% מהקריאות ו-33% מהטרנזקציות במסד הראשי, ובדיקה מחדש של הגדרת מקביליות התהליכונים הישנה של InnoDB הסירה מגבלה נוספת.
המעבר והתוצאות
Redis ו-MySQL פעלו במקביל ב"מצב צל", שבו Redis נותר מקור האמת; לאחר מכן עברה שופיפיי למקור אמת ב-MySQL, תוך שמירה על מתג עצירה והשקה הדרגתית פוד אחר פוד, החל בפודים בעלי תעבורה נמוכה. במבצעי בזק עתירי נפח נשאר המעבד של צומת הכתיבה מתחת ל-50% ושל צומת הקריאה מתחת ל-16%. בבלאק פריידיי 2025 הגיעו הסוחרים בפלטפורמה לשיא של 5.1 מיליון דולר מכירות בדקה.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.