אתר וידאו בעל תעבורה גבוהה צמצם את מספר שאילתות מסד הנתונים עבור פיד דף הטרנדים שלו מ-4,000 לדקה לפחות מ-50, והוריד את זמן התגובה בפרצנטיל 95 מ-380 מילישניות ל-40 מילישניות, וזאת על ידי מעבר משימוש במטמון (caching) של דף שלם למטמון מקטעי (fragment caching) באמצעות Varnish ו-Edge Side Includes (ESI).
מדוע האתר נזקק לאסטרטגיית מטמון שונה
דף הבית המציג את הסרטונים הנצפים ביותר של היום נראה כמעט אותו דבר עבור כל מבקר באזור מסוים: כ-95 אחוז מה-HTML זהים עבור מיליון משתמשים, בעוד ש-5 האחוזים הנותרים מכילים נתונים אישיים כגון שם המשתמש המחובר או תיבת חיפוש. צוות ההנדסה עמד בפני שתי אפשרויות לא אטרקטיביות:
- לשמור את הדף כולו במטמון ולהסתכן בהצגת נתונים אישיים לא מעודכנים למשתמשים מחוברים.
- לעקוף את המטמון לחלוטין ולאפשר לכל בקשה "להפציץ" את מסד הנתונים.
שתי הגישות פגעו בחוויית המשתמש. הצוות פנה ל-ESI, טכניקה המאפשרת ל-reverse-proxy להרכיב דף ממקטעים המאוחסנים במטמון באופן עצמאי בקצה הרשת (edge).
כיצד הוטמע המטמון המקטעי
Varnish, מאיץ ה-HTTP בקוד פתוח, התייחס לדף כאל שלד עם שלושה חלקים ניתנים להחלפה:
- רשת הווידאו (Video grid) – הרשימה היקרה והרחבה של סרטוני הטרנדים. נשמרת במטמון למשך 60 שניות מכיוון שהיא משתנה לעיתים קרובות אך זהה עבור כל מבקר אנונימי.
- מתג שפה (Language switcher) – אלמנט UI סטטי ששינויים בו נדירים. נשמר במטמון למשך 24 שעות.
- כותרת (Header) – המקטע האישי היחיד באמת (שם משתמש, תמונת פרופיל, התראות). לעולם אינו נשמר במטמון; Varnish מעביר את הבקשה לשרת האפליקציה בכל פעם.
כאשר מגיעה בקשה, Varnish מגיש את השלד המאוחסן במטמון, שואב את שני המקטעים המאוחסנים מהמאגר המקומי שלו, ומכניס את הכותרת החיה מה-backend.
המספרים שחשובים
לאחר המעבר:
- עומס מסד הנתונים עבור דף הטרנדים ירד מ-4,000 שאילתות לדקה לפחות מ-50.
- השהיה (latency) בפרצנטיל 95 ירדה מ-380 מילישניות ל-40 מילישניות.
שלושה לקחים מעשיים מההטמעה
1. תקופות חסד (Grace periods) מרככות את השפעת החמצת המטמון כאשר פג תוקף ה-TTL של מקטע, Varnish בדרך כלל עוצר כדי להביא תוכן טרי, מה שיוצר קפיצת השהיה שעלולה להוביל ל-"thundering herd" (עדר רעמים) של קריאות backend בו-זמניות. על ידי הגדרת תקופת חסד (grace period), Varnish ממשיך להגיש את המקטע הישן בזמן שהוא מרענן את המטמון בשקט ברקע. המשתמשים אינם חשים בעיכוב; ה-backend רואה קצב בקשות קבוע וניתן לניהול.
2. הסרת עוגיות (cookies) עבור מקטעים אנונימיים עוגיות המצורפות לכל בקשה גורמות ל-Varnish להתייחס לכל בקשה כייחודית, מה שמבטל את היתרון של פגיעה במטמון (cache hits). הצוות הסיר עוגיות עבור רשת הווידאו ומתג השפה, מה שאיפשר לאחסן את המקטעים הללו במטמון בצורה אגרסיבית. רק מקטע הכותרת נושא עוגיות, מה ששומר על ההתאמה האישית מבלי להקריב את יעילות המטמון.
3. מפתחות תחליפיים (Surrogate keys) מאפשרים ניקוי (purging) מיידי לפעמים יש להסיר סרטון באופן מיידי – למשל, מסיבות של זכויות יוצרים. המתנה לפקיעת ה-TTL של 60 השניות אינה מקובלת. על ידי תיוג כל מקטע במטמון באמצעות surrogate key המשקף את מזהי הווידאו שבבסיסו, הצוות יכול להוציא פקודת purge אחת שמבטלת באופן מיידי את כל העותקים של סרטון ספציפי בכל צומת קצה (edge node). זה מונע סריקה מלאה של המטמון ושומר על תאימות האתר לחוקים.
בשורה התחתונה: מטמון מקטעי (Fragment caching) באמצעות Varnish ו-ESI הופך דף מונוליטי התלוי במסד הנתונים למערכת של חלקים קלים וניתנים לשימוש חוזר, מה שמפחית משמעותית את עומס ה-backend והשהיה, תוך שמירה על התאמה אישית לכל משתמש.
