היתרונות והחסרונות של שימוש בלוגיקה עקבית או שונה של תפוגה בשכבות המטמון של ה-service worker ובשכבות המטמון של ה-HTTP.
קובצי שירות ואפליקציות מסוג PWA הופכים לסטנדרטים של אפליקציות אינטרנט מודרניות, אבל השמירה במטמון של משאבים הפכה למורכבת יותר מתמיד. במאמר הזה נסביר על התמונה הגדולה של אחסון נתונים במטמון הדפדפן, כולל:
- תרחישים לדוגמה של שימוש במטמון של שירותי עבודה (service workers) ובמטמון של HTTP, וההבדלים ביניהם.
- היתרונות והחסרונות של שיטות שונות לתפוגת תוקף של מטמון של שירותי עבודה בהשוואה לשיטות רגילות של מטמון HTTP.
סקירה כללית של תהליך השמירה במטמון
ברמת העל, הדפדפן פועל לפי סדר האחסון במטמון הבא כששולחים בקשה למשאב:
- מטמון של עובד שירות: עובד השירות בודק אם המשאב נמצא במטמון שלו, ומחליט אם להחזיר את המשאב עצמו על סמך אסטרטגיות השמירה במטמון שמוגדרות בו. חשוב לזכור שהפעולה הזו לא מתבצעת באופן אוטומטי. צריך ליצור בורר אירועי אחזור ב-service worker ולעצור בקשות מהרשת, כדי שהבקשות יוצגו מהמטמון של ה-service worker ולא מהרשת.
- מטמון HTTP (נקרא גם מטמון הדפדפן): אם המשאב נמצא במטמון ה-HTTP ותוקף השימוש בו עדיין בתוקף, הדפדפן משתמש באופן אוטומטי במשאב ממטמון ה-HTTP.
- בצד השרת: אם לא נמצא דבר במטמון של ה-service worker או במטמון ה-HTTP, הדפדפן פונה לרשת כדי לבקש את המשאב. אם המשאב לא נשמר במטמון ב-CDN, הבקשה חייבת לחזור עד לשרת המקור.
שמירת שכבות במטמון
שמירת נתונים במטמון של קובץ שירות (service worker)
קובץ שירות (service worker) מיירט בקשות HTTP מסוג רשת ומשתמש באסטרטגיית שמירה במטמון כדי לקבוע אילו משאבים צריך להחזיר לדפדפן. המטמון של קובץ השירות (service worker) ומטמון ה-HTTP משרתים את אותה מטרה כללית, אבל המטמון של ה-Service Worker מציע יכולות נוספות לשמירה במטמון, כמו שליטה מדויקת על מה שנשמר במטמון ועל אופן הביצוע של השמירה במטמון.
שליטה במטמון של ה-service worker
שירות העבודה מיירט בקשות HTTP באמצעות מאזינים לאירועים (בדרך כלל האירוע fetch
). קטע הקוד הזה מדגים את הלוגיקה של שיטת האחסון במטמון Cache-First.
מומלץ מאוד להשתמש ב-Workbox כדי לא להמציא מחדש את הגלגל. לדוגמה, אפשר לרשום נתיבי כתובות URL של משאבים באמצעות שורה אחת של קוד ביטוי רגולרי.
import {registerRoute} from 'workbox-routing';
registerRoute(new RegExp('styles/.*\\.css'), callbackHandler);
אסטרטגיות שמירת מטמון ותרחישים לדוגמה של שירותי עבודה
בטבלה הבאה מפורטות אסטרטגיות נפוצות של שמירת נתונים במטמון של שירותים עובדים, ומוסבר מתי כדאי להשתמש בכל אחת מהן.
אסטרטגיות | הסיבה לעדכניות | תרחישי שימוש |
---|---|---|
רשת בלבד | התוכן צריך להיות מעודכן תמיד. |
|
הרשת עוברת למטמון | מומלץ להציג את התוכן העדכני. עם זאת, אם הרשת נכשלת או לא יציבה, מותר להציג תוכן ישן יחסית. |
|
Stale-while-revalidate | אפשר להציג מיד תוכן שנשמר במטמון, אבל בעתיד כדאי להשתמש בתוכן מעודכן שנשמר במטמון. |
|
אחסון במטמון קודם, מעבר לרשת אם צריך | התוכן לא קריטי וניתן להציג אותו מהמטמון כדי לשפר את הביצועים, אבל לפעמים כדאי לשירות העובד לבדוק אם יש עדכונים. |
|
מטמון בלבד | התוכן משתנה לעיתים רחוקות. |
|
יתרונות נוספים של שמירה במטמון של קובצי שירות (service worker)
בנוסף לבקרה מפורטת על הלוגיקה של שמירת הנתונים במטמון, שמירת הנתונים במטמון של קובץ השירות מספקת גם:
- יותר זיכרון ונפח אחסון בשביל המקור: הדפדפן מקצה משאבים של מטמון HTTP לפי מקור. במילים אחרות, אם יש כמה תת-דומיינים, כולם חולקים את אותו מטמון HTTP. אין ערובה לכך שהתוכן של המקור או הדומיין שלכם יישאר במטמון ה-HTTP למשך זמן רב. לדוגמה, משתמש יכול לנקות את המטמון באופן ידני בממשק המשתמש של הגדרות הדפדפן, או להפעיל טעינת דף מחדש באופן מלא. כשמשתמשים במטמון של שירות עובד, יש סיכוי גבוה הרבה יותר שהתוכן ששמור במטמון יישאר במטמון. מידע נוסף זמין במאמר אחסון מתמיד.
- גמישות גבוהה יותר ברשתות רעות או בחוויות אופליין: במטמון ה-HTTP יש לכם רק אפשרות בינארית: אם המשאב יישמר במטמון או לא. בעזרת שמירה במטמון של Service Worker קל יותר לצמצם שיבושים קטנים (באמצעות האסטרטגיה 'sold-while-reVerify'), להציע חוויה מלאה אופליין (באמצעות האסטרטגיה 'cache only'), או אפילו משהו ביניהם, כמו ממשקי משתמש מותאמים אישית, שבהם חלקים בדף מגיעים מהמטמון של Service Worker וחלקים מוחרגים (באמצעות האסטרטגיה Set take feed handler) במקרים הרלוונטיים.
שמירת HTTP במטמון
בפעם הראשונה שדפדפן טוען דף אינטרנט ומשאבים קשורים, הוא שומר את המשאבים האלה במטמון ה-HTTP שלו. בדרך כלל, הדפדפנים מפעילים את מטמון ה-HTTP באופן אוטומטי, אלא אם משתמש הקצה השבית אותו במפורש.
כשמשתמשים במטמון HTTP, צריך להסתמך על השרת כדי לקבוע מתי לשמור משאב במטמון ולמשך כמה זמן.
שליטה בתוקף התגובה במטמון HTTP באמצעות כותרות תגובה של HTTP
כששרת מגיב לבקשת דפדפן למשאב, השרת משתמש בכותרות תגובה של HTTP כדי להנחות את הדפדפן למשך כמה זמן צריך לשמור את המשאב במטמון. מידע נוסף זמין בקטע כותרות תגובות: הגדרת שרת האינטרנט.
אסטרטגיות שמירת HTTP במטמון ותרחישי שימוש
שמירת נתונים במטמון של HTTP פשוטה הרבה יותר משמירת נתונים במטמון של קובץ שירות, כי שמירת נתונים במטמון של HTTP עוסקת רק בלוגיקה של תפוגת תוקף משאבים מבוססת-זמן (TTL). למידע נוסף על אסטרטגיות של אחסון במטמון של HTTP, אפשר לעיין בקטע באילו ערכים של כותרות תגובה כדאי להשתמש? ובקטע סיכום.
תכנון הלוגיקה של תפוגת התוקף במטמון
בקטע הזה מוסבר מהם היתרונות והחסרונות של שימוש בלוגיקה עקבית של תפוגה בשכבות המטמון של ה-service worker ובשכבות המטמון של ה-HTTP, וגם מהם היתרונות והחסרונות של שימוש בלוגיקה נפרדת של תפוגה בשכבות האלה.
התקלה הבאה מראה איך שמירה במטמון של קובץ שירות (service worker) ושמירה במטמון HTTP פועלים בתרחישים שונים:
לוגיקה עקבית של תפוגה לכל שכבות המטמון
כדי להמחיש את היתרונות והחסרונות, נבחן 3 תרחישים: לטווח ארוך, לטווח בינוני ולטווח קצר.
תרחישים | שמירה במטמון לטווח ארוך | שמירה במטמון לטווח בינוני | שמירה במטמון לטווח קצר |
---|---|---|---|
אסטרטגיית האחסון במטמון של קובץ השירות | מטמון, חזרה לרשת | לא פעיל בזמן אימות מחדש | הרשת חוזרת למטמון |
TTL של מטמון של קובץ שירות (service worker) | 30 ימים | יום אחד | 10 דקות |
משך הזמן המקסימלי במטמון של HTTP | 30 ימים | יום אחד | 10 דקות |
תרחיש: שמירה במטמון לטווח ארוך (מטמון, חזרה לרשת)
- כשמשאב ששמור במטמון תקף (עד 30 יום): ה-service worker מחזיר את המשאב ששמור במטמון באופן מיידי בלי להתחבר לרשת.
- כשפג התוקף של משאב ששמור במטמון (יותר מ-30 יום): ה-service worker עובר לרשת כדי לאחזר את המשאב. בדפדפן אין עותק של המשאב במטמון ה-HTTP שלו, ולכן הוא עובר אל המשאב בצד השרת.
חיסרון: בתרחיש הזה, אחסון במטמון של HTTP מספק פחות ערך כי הדפדפן תמיד מעביר את הבקשה לצד השרת כשפג התוקף של המטמון בקובץ השירות.
תרחיש: שמירת נתונים במטמון לטווח בינוני (Stale-while-revalidate)
- כשמשאב ששמור במטמון תקף (עד יום אחד): ה-service worker מחזיר את המשאב ששמור במטמון באופן מיידי, וממשיך לרשת כדי לאחזר את המשאב. בדפדפן יש עותק של המשאב במטמון ה-HTTP שלו, ולכן הוא מחזיר את העותק הזה לקובץ השירות.
- כשפג התוקף של משאב שנשמר במטמון (יותר מיום אחד): ה-Service Worker מחזיר את המשאב שנשמר במטמון באופן מיידי ועובר לרשת כדי לאחזר את המשאב. בדפדפן אין עותק של המשאב במטמון ה-HTTP שלו, ולכן הוא עובר לשרת כדי לאחזר את המשאב.
חיסרון: כדי לנצל את מלוא היתרונות של השלב 'אימות מחדש', נדרש קובץ שירות (service worker) עם קוד נוסף לביטול מטמון כדי לשנות את מטמון ה-HTTP.
תרחיש: שמירה במטמון לטווח קצר (החזרת הרשת למטמון)
- כשמשאב ששמור במטמון תקף (עד 10 דקות): ה-service worker עובר לרשת כדי לאחזר את המשאב. לדפדפן יש עותק של המשאב במטמון ה-HTTP שלו, כך שהוא מחזיר אותו ל-Service Worker בלי לעבור לצד השרת.
- כשפג התוקף של משאב ששמור במטמון (יותר מ-10 דקות): ה-service worker מחזיר את המשאב ששמור במטמון באופן מיידי, וממשיך לרשת כדי לאחזר את המשאב. לדפדפן אין עותק של המשאב במטמון ה-HTTP שלו, ולכן הוא עובר בצד השרת כדי לאחזר את המשאב.
חיסרון: בדומה לתרחיש האחסון במטמון לטווח הבינוני, קובץ השירות (service worker) דורש לוגיקה נוספת לביטול האחסון במטמון כדי לשנות את מטמון ה-HTTP ולשלוף את המשאב העדכני ביותר מצד השרת.
Service worker בכל התרחישים
בכל התרחישים, המטמון של ה-Service Worker עדיין יכול להחזיר משאבים שנשמרו במטמון כשהרשת לא יציבה. לעומת זאת, המטמון של HTTP לא מהימן כשהרשת לא יציבה או מושבתת.
לוגיקה שונה של תפוגת התוקף של המטמון בשכבות ה-HTTP והמטמון של ה-Service Worker
כדי להמחיש את היתרונות והחסרונות, נבחן שוב תרחישים של טווח ארוך, בינוני וקצר.
תרחישים | שמירה במטמון לטווח ארוך | שמירה במטמון לטווח בינוני | שמירה במטמון לטווח קצר |
---|---|---|---|
אסטרטגיית האחסון במטמון של קובץ השירות | מטמון, חזרה לרשת | לא פעיל בזמן אימות מחדש | הרשת חוזרת למטמון |
TTL של מטמון של קובץ שירות (service worker) | 90 ימים | 30 ימים | יום אחד |
משך הזמן המקסימלי במטמון של HTTP | 30 ימים | יום אחד | 10 דקות |
תרחיש: שמירה במטמון לטווח ארוך (מטמון, חזרה לרשת)
- כשמשאב ששמור במטמון תקף במטמון של Service Worker (פחות מ-90 ימים): ה-service worker מחזיר את המשאב שנשמר במטמון באופן מיידי.
- כשתוקף המשאב שנשמר במטמון פג במטמון של ה-service worker (יותר מ-90 יום): ה-service worker עובר לרשת כדי לאחזר את המשאב. אין בדפדפן עותק של המשאב במטמון ה-HTTP שלו, ולכן הוא עובר לשרת.
יתרונות וחסרונות:
- Pro: המשתמשים מקבלים תגובה מיידית כי Service Worker מחזיר משאבים שנשמרו במטמון באופן מיידי.
- יתרון: ל-service worker יש שליטה מפורטת יותר לגבי הזמנים שבהם הוא משתמש במטמון שלו, והזמנים שבהם הוא מבקש גרסאות חדשות של משאבים.
- חסרון: נדרשת אסטרטגיית שמירה במטמון של Service Worker מוגדרת היטב.
תרחיש: שמירה במטמון ברמת אמצע (מצב מושהה בזמן אימות מחדש)
- כשמשאב ששמור במטמון תקף במטמון של Service Worker (פחות מ-30 ימים): ה-service worker מחזיר את המשאב שנשמר במטמון באופן מיידי.
- כשפג התוקף של משאב שנשמר במטמון במטמון של ה-Service Worker (יותר מ-30 ימים): ה-Service Worker עובר לרשת של המשאב. אין לדפדפן עותק של המשאב במטמון ה-HTTP שלו, ולכן הוא עובר לצד השרת.
יתרונות וחסרונות:
- יתרון: המשתמשים מקבלים תגובה מיידית כי ה-service worker מחזיר משאבים שנשמרו במטמון באופן מיידי.
- יתרון: בעזרת תהליך האימות מחדש שמתרחש "ברקע", ה-service worker יכול לוודא שבבקשה הבאה לכתובת URL מסוימת תהיה תגובה חדשה מהרשת.
- חיסרון: נדרשת אסטרטגיית מטמון מוגדרת היטב לשירות העובד.
תרחיש: שמירה במטמון לטווח קצר (החזרת הרשת למטמון)
- כשמשאב ששמור במטמון תקין במטמון של ה-Service Worker (פחות מיום אחד): ה-Service Worker עובר לרשת של המשאב. הדפדפן מחזיר את המשאב מהמטמון של HTTP, אם הוא נמצא שם. אם הרשת לא פועלת, קובץ השירות מחזיר את המשאב מהמטמון של קובץ השירות
- כשתוקף המשאב ששמור במטמון של ה-service worker פג (יותר מיום אחד): ה-service worker יוצר קשר עם הרשת כדי לאחזר את המשאב. הדפדפן מאחזר את המשאבים דרך הרשת כי פג התוקף של הגרסה שנשמרה במטמון ה-HTTP.
יתרונות וחסרונות:
- Pro: כשהרשת לא יציבה או מושבתת, ה-Service Worker מחזיר את המשאבים שנשמרו במטמון באופן מיידי.
- חסרון: ה-Service Worker דורש עקיפת מטמון (cache busting) כדי לעקוף את המטמון של HTTP ולשלוח בקשות מסוג 'הרשת הראשונה'.
סיכום
בגלל המורכבות של השילוב של התרחישים של שמירת נתונים במטמון, אי אפשר לתכנן כלל אחד שיכסה את כל המקרים. עם זאת, על סמך הממצאים בקטעים הקודמים, יש כמה הצעות שכדאי לבדוק כשמתכננים את אסטרטגיות המטמון:
- הלוגיקה של שמירת הנתונים במטמון של שירות העבודה לא חייבת להיות עקבית עם הלוגיקה של תפוגת התוקף של שמירת הנתונים במטמון של HTTP. אם אפשר, כדאי להשתמש בלוגיקה של תפוגה ארוכה יותר בקובץ השירות כדי לתת לו יותר שליטה.
- אחסון ב-HTTP עדיין ממלא תפקיד חשוב, אבל הוא לא מהימן כשהרשת לא יציבה או כשהיא מושבתת.
- כדאי לבדוק מחדש את אסטרטגיות האחסון במטמון לכל משאב כדי לוודא שאסטרטגיית האחסון במטמון של ה-service worker מספקת את הערך שלה, בלי להתנגש במטמון ה-HTTP.