שמירה על עדכניות בעזרת תכונות לא עדכניות תוך כדי אימות

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

מה נשלח?

stale-while-revalidate עוזר למפתחים לאזן בין מיידיות - טעינה מיידית של תוכן שנשמר במטמון - לבין עדכניות התוכן - לוודא שייעשה שימוש בעתיד בעדכונים לתוכן ששמור במטמון. אם אתם מנהלים ספרייה או שירות אינטרנט של צד שלישי שמתעדכנים לפי לוח זמנים קבוע, או שלנכסים של צד ראשון יש בדרך כלל תוחלת חיים קצרה, stale-while-revalidate יכול להיות תוספת שימושית למדיניות השמירה במטמון.

התמיכה בהגדרה stale-while-revalidate לצד max-age בכותרת התגובה של Cache-Control זמינה ב-Chrome 75 וב-Firefox 68.

דפדפנים שלא תומכים ב-stale-while-revalidate יתעלמו באופן שקט מערך ההגדרה הזה וישתמשו ב-max-age, כפי שאסביר בהמשך...

מה זה אומר?

נחלק את stale-while-revalidate לשני חלקים: הרעיון שתגובה שנשמרה במטמון עשוי להיות לא פעיל ותהליך האימות מחדש.

ראשית, כיצד הדפדפן יודע אם תגובה שנשמרה במטמון 'לא פעילה'? כותרת תגובה של Cache-Control שמכילה את stale-while-revalidate צריכה גם להכיל max-age, ומספר השניות שמצוין באמצעות max-age הוא הגורם לחוסר פעילות. כל תגובה שנשמרה במטמון אחרי יותר מ-max-age נחשבת לרעננה, ותגובות ישנות יותר שנשמרו במטמון לא עדכניות.

אם התגובה שנשמרה במטמון המקומי עדיין עדכנית, אפשר להשתמש בה כפי שהיא כדי למלא בקשות של דפדפן. מבחינת stale-while-revalidate, לא צריך לעשות כלום בתרחיש הזה.

אבל אם התגובה שנשמרה במטמון לא פעילה, מתבצעת בדיקה נוספת שמבוססת על גיל: האם הגיל של התגובה שנשמרה במטמון הוא בחלון הזמן הנוסף של ההגדרה stale-while-revalidate?

אם בחלון הזה מופיעה תגובה לא עדכנית, היא תשמש למילוי הבקשה של הדפדפן. במקביל תתבצע בקשת 'אימות מחדש' נגד הרשת באופן שלא יעכב את השימוש בתגובה שנשמרה במטמון. התשובה שמוחזרת עשויה להכיל את אותו המידע שהתקבל מהתגובה שנשמרה במטמון בעבר, או שהיא יכולה להיות שונה. בכל מקרה, תגובת הרשת מאוחסנת באופן מקומי, מחליפה את מה שהיה שמור במטמון ומגדירה מחדש את טיימר 'רענון' שהיה בשימוש במהלך השוואות עתידיות עם max-age.

עם זאת, אם התגובה השמורה במטמון לא פעילה מספיק ישנה מספיק כך שהיא חלה מחוץ לחלון הזמן של stale-while-revalidate, היא לא תמלא את הבקשה של הדפדפן. במקום זאת, הדפדפן יאחזר תגובה מהרשת וישתמש בה גם למילוי הבקשה הראשונית וגם לאכלוס המטמון המקומי בתגובה חדשה.

דוגמה בזמן אמת

בהמשך מוצגת דוגמה פשוטה ל-HTTP API להחזרת השעה הנוכחית – ובאופן ספציפי יותר, מספר הדקות הנוכחי אחרי השעה הנוכחית.

בתרחיש הזה, שרת האינטרנט משתמש בכותרת Cache-Control הזו בתגובת ה-HTTP שלו:

Cache-Control: max-age=1, stale-while-revalidate=59

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

אם בקשה חוזרת על עצמה בין 1 ל-60 שניות לאחר מכן, הערך ששמור במטמון לא יהיה פעיל, אבל הוא ישמש למילוי בקשת ה-API. במקביל, תתבצע בקשת אימות מחדש על מנת לאכלס את המטמון עם ערך חדש לשימוש עתידי.

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

לפניכם פירוט של שלושת המצבים הנפרדים האלה, לצד חלון הזמן שבו כל אחד מהם חל על הדוגמה שלנו:

תרשים שממחיש את המידע מהקטע הקודם.

מהם התרחישים לדוגמה הנפוצים?

הדוגמה שלמעלה לגבי שירות API "דקות אחרי השעה" היא אמנם השערות, אבל היא ממחישה את התרחיש לדוגמה המבוקש – שירותים שמספקים מידע שצריך לרענן, אבל מקבלים מידה מסוימת של חוסר פעילות.

דוגמאות פחות מדויקות יכולות להיות API לתנאי מזג האוויר הנוכחיים או לכותרות החדשותיות המובילות שנכתבו בשעה האחרונה.

באופן כללי, סביר להניח שכל תגובה שמתעדכנת במרווחי זמן ידועים היא לבקש כמה פעמים, והיא סטטית במרווח הזמן הזה מתאימה לשמירה במטמון לטווח קצר באמצעות max-age. שימוש ב-stale-while-revalidate בנוסף ל-max-age מגדיל את הסבירות לכך שיהיה אפשר למלא בקשות עתידיות מהמטמון עם תוכן עדכני יותר, בלי לחסום תגובה מהרשת.

איך הוא מקיים אינטראקציה עם קובצי שירות (service worker)?

אם שמעתם על stale-while-revalidate, סביר להניח שזה היה בהקשר של מתכונים שנמצאים בשימוש ב-service worker.

לשימוש ב-Service Worker יש כמה קווי דמיון בין השימוש באימות מחדש 'לא פעיל בזמן אימות מחדש' באמצעות כותרת Cache-Control, ובמקרים רבים יש שיקולים מסוימים לגבי שוויון חדשני של עדכניות ומשך חיים מקסימלי. עם זאת, יש כמה שיקולים שצריך לקחת בחשבון כשמחליטים אם ליישם גישה שמבוססת על Service Worker או רק על הגדרת הכותרת Cache-Control.

כדאי להשתמש בגישה של קובץ שירות (service worker) אם...

  • כבר השתמשת ב-Service Worker באפליקציית האינטרנט שלך.
  • אתם צריכים שליטה פרטנית על תוכן המטמון שלכם, ואתם רוצים ליישם משהו כמו מדיניות תפוגת תוקף שלא השתמשתם בה לאחרונה. אפשר להיעזר במודול cache Expiration של Workbox כדי לעשות זאת.
  • אתם רוצים לקבל התראה כשתגובה לא עדכנית משתנה ברקע במהלך שלב האימות מחדש. המודול עדכון מטמון שידור של Workbox יכול לעזור בכך.
  • ההתנהגות הזו של stale-while-revalidate נדרשת בכל הדפדפנים המודרניים.

השתמש בגישת Cache-Control אם...

  • עדיף לא להתמודד עם התקורה של הפריסה והתחזוקה של Service Worker לאפליקציית האינטרנט.
  • אין לכם בעיה אם לאפשר לניהול האוטומטי של המטמון של הדפדפן למנוע מהמטמון המקומי להיות גדול מדי.
  • אין בעיה עם הגישה שכרגע לא נתמכת בכל הדפדפנים המודרניים (החל מיולי 2019; התמיכה עשויה לגדול בעתיד).

אם אתם משתמשים בקובץ שירות (service worker) וגם הפעלתם את stale-while-revalidate בחלק מהתגובות דרך הכותרת Cache-Control, ה-Service Worker יקבל באופן כללי 'פתיחה ראשונה' בתגובה לבקשה. אם קובץ השירות (service worker) מחליט לא להגיב, או במהלך יצירת תגובה הוא שולח בקשת רשת באמצעות fetch(), ההתנהגות שהוגדרה דרך הכותרת Cache-Control תיכנס לתוקף.

מידע נוסף

תמונה ראשית (Hero) של סמואל זלר.