מחשבות על max-age ושרתי cache

נניח שיש לנו קובץ נתונים שמתעדכן כל יום ראשון ב-8 בבוקר, אנו נוסיף ל-Http header:
max-age: $cache-time

כאשר $cache-time = ה-timestamp ביום ראשון בשעה 8 פחות ה-timestamp ברגע זה.

הפתרון הזה יעבוד בצורה מעולה, אבל מה יקרה אם נשתמש בשרת cache/cdn/proxy (קאש) כדי להגיש את הקובץ?

שרתי קאש יודעים לקרוא את ה-Headers ולעדכן את התוכן בהתאם, כלומר שרת קאש קורא קובץ עם max-age של שבוע (604800 שניות), ישמור את הקובץ למשך שבוע אלא אם הוגדר אחרת.

הבעיה במקרה הזה, אם לדוגמא שרת הקאש שמר את הקובץ ביום שני, ה-max-age עומד על 6 ימים קדימה. כאשר גולש יגש לקובץ ביום שבת, הוא יקבל את אותו ה-Header המקורי מיום שני. כלומר, הדפדפן של הגולש ישמור את הקובץ עד יום שישי הקרוב. כאשר הקובץ בשרת מתעדכן ביום ראשון הקרוב – התוצאה: 5 ימים בהם הגולש צופה בנתונים לא עדכניים.

המצב המתואר לא יקרה ב-Varnish, משום שב-Varnish משתמשים ב-Age header (מיישם את אותו עיקרון $cache-time אך בצורה שונה).

ב-nginx אפשר להימנע מהמצב המתואר למעלה ע"י שימוש מותאם אישית (באמצעות location) ב-proxy_cache_valid המגדיר ל-nginx כמה זמן לשמור על הקובץ בקאש.

מה המסקנה מכל הפוסט הזה?
הקדישו מחשבה נוספת על תכנון קאש נכון. יש קבצים שבכלל לא צריכים להיות בזכרון קאש. ויש קבצים שבגלל הגדרות קאש לא נכונות משפיעים לרעה על מהירות האתר.

עד הפעם הבאה.
אבי.

פורסם בקטגוריה לינוקס. אפשר להגיע לכאן עם קישור ישיר.

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *