עובדים של שירותי תוסף יכולים עכשיו להישאר בחיים כל עוד הם מקבלים אירועים. דבר זה מגביר את האמינות של עובדי שירותי התוסף, אבל יש מלכודה שצריך להימנע ממנה.
החל מגרסה 110 של Chrome (בגרסת בטא החל מ-7 בפברואר 2023), עובדים בשירותי תוספים ממשיכים לפעול כל עוד הם מקבלים אירועים. פעולה זו פותרת בעיית תזמון בהטמעה הקודמת של תוספי שירות (service worker). ייתכן שזמן קצוב לתפוגה יתרחש כשאירועים חדשים היו בתור האירועים והזמן הקצוב לתפוגה יקצר את העבודה האסינכרונית. השיפור הזה מבטל את משך החיים המקסימלי של 5 דקות עבור עובדי שירות הרחבה.
במאמר הזה נסביר איך ההתנהגויות האלה השתנו.
רקע
עובדים של שירותי תוספים בדרך כלל מתנהגים כמו עובדים בשירות אינטרנט, אבל בנוסף לאירועים של עובדי שירות, עובדים בשירות תוספים יכולים גם להאזין לאירועים של תוספים. אירועים רגילים של קובצי שירות (service worker) מאריכים את משך החיים של קובץ השירות, אבל לפני תחילת ההשקה של 110 אירועים בודדים בלבד של פלטפורמות הרחבה השאירו אותו בחיים.
בדרך כלל, Chromium מסיים קובצי שירות (service worker) אחרי שמתקיים אחד מהתנאים הבאים:
- קובץ השירות (service worker) לא קיבל אירוע במשך יותר מ-30 שניות ואין משימות שמתבצעות כבר זמן רב. אם קובץ שירות (service worker) קיבל אירוע בפרק הזמן הזה, הוסר הטיימר שלא פעיל.
- משימה ממושכת נמשכה יותר מחמש דקות, ולא התקבלו אירועים ב-30 השניות האחרונות.
אירועים חדשים של Service Worker שהתקבלו לפני שהטיימר ללא פעילות או הזמן הקצוב לתפוגה של טיימר למשימה ממושך יאפסו את הטיימרים ויאריכו את משך החיים של ה-Service Worker.
לצערנו, ההתנהגות הזו לא חלה על אירועי תוספים. אירועי תוספים יכולים להוציא ממצב שינה עובד של שירות תוספים ולהשאיר אותו פעיל עד לסיום האירוע, אבל הם לא יכולים להאריך את משך הזמן של 30 השניות ללא פעילות. המשמעות בפועל הייתה שעובדי שירות של תוספים היו יכולים להפסיק לפעול בכל שלב לאחר שאירוע התוסף האחרון הושלם, גם אם הדפדפן שלח בדיוק אירוע חדש לתוסף.
מה השתנה
החל מגרסה 110 של Chrome, כל האירועים יאפסו את הטיימר שאינו פעיל, והזמן הקצוב לתפוגה של חוסר פעילות לא יתרחש אם יש אירועים בהמתנה. במילים אחרות, בהנחה שאין הפרעות בלתי צפויות, עובדים של שירותי תוספים יכולים להישאר בחיים כל עוד הם מעבדים אירועים באופן פעיל. בנוסף, קריאות לממשקי API ספציפיים של Chrome לתוספים, כמו chrome.storage.local.get()
, יאפסו את הזמן הקצוב לתפוגה שהוגדר לחוסר פעילות. פרטים נוספים:
- Service Worker מסתיים אחרי 30 שניות של חוסר פעילות. (קבלת אירוע או קריאה ל-API של תוסף יאפסו את הטיימר הזה).
- קובץ השירות (service worker) מסתיים אם העיבוד של בקשה יחידה, כמו אירוע או קריאה ל-API, נמשך יותר מ-5 דקות.
חלק מממשקי ה-API, כמו העברת הודעות נייטיב, מספקים תוספת חיים חזקה שמאפשרת לבטל את שני הטיימרים האלה.
אנחנו עדיין פועלים כדי להבטיח שעובדי שירות של תוספים ימשיכו להיות מופסקים כשהדבר אפשרי, בלי להשבית את העבודה הממושכת. עובדי שירות שמטפלים במשאבים שמודעים למשאבים תמיד צריכים להפיק את המקסימום, ככל האפשר. בנוסף, התוספים צריכים להתכונן לסגירה לא צפויה באמצעות מצב קבוע. כך אפשר להגן מפני אירועים לא צפויים כמו סגירה מאולצת של הדפדפן על ידי המשתמש.
תמונה מאת פאולה גריירו ב-Unbounce