משך חיים ארוך יותר של קובץ שירות בתוסף

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

ג'ו מדלי
ג'ו מדלי

החל מ-Chrome 110 (בגרסת בטא החל מ-7 בפברואר 2023), עובדי שירות של תוספים נשארים פעילים כל עוד הם מקבלים אירועים. הפעולה הזו פותרת בעיית תזמון שבוצעה בהטמעה הקודמת של שירותי ההרחבות (service worker). יכול להיות שהתרחשו זמנים קצובים לתפוגה כשאירועים חדשים היו בתור האירועים, ותפוגות הזמן הקצוב לתפוגה יקטעו את העבודה האסינכרונית. השיפור הזה מקצר את משך החיים המקסימלי של חמש דקות לעובדי שירות הרחבה.

במאמר הזה מתואר איך ההתנהגויות האלה השתנו.

רקע

קובצי שירות של תוספים מתנהגים בדרך כלל כמו עובדים של שירותי אינטרנט, אבל בנוסף לאירועים של קובצי שירות (service worker), קובצי שירות של תוספים יכולים גם להאזין לאירועים של תוספים. בעוד שאירועים רגילים של Service Worker מאריכים את תוחלת החיים של קובץ השירות (service worker), לפני שחרורם של 110 אירועים, רק מספר קטן של אירועים של פלטפורמת תוסף השאירו את ה-Service Worker במצב פעיל.

בדרך כלל, Chromium מסיים שירות קובץ שירות (service worker) לאחר שמתקיים אחד מהתנאים הבאים:

  • קובץ השירות (service worker) לא קיבל אירוע במשך יותר מ-30 שניות ואין משימות ארוכות שנמצאות בטיפול. אם קובץ שירות (service worker) קיבל אירוע בפרק הזמן הזה, הטיימר ללא פעילות הוסר.
  • השלמת משימה ממושכת נמשכה יותר מחמש דקות, ולא התקבלו אירועים בשלושים השניות האחרונות.

אירועים חדשים של קובץ השירות (service worker) שהתקבלו לפני תפוגת הטיימר ללא פעילות או תפוגת הטיימר למשימות ארוכות יגרמו לאיפוס הטיימרים ולהארכת משך החיים של קובץ השירות (service worker).

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

מה השתנה?

החל מגרסה 110 של Chrome, כל האירועים מאפסים את הטיימר ללא פעילות, והזמן הקצוב לתפוגה שהוגדר לחוסר פעילות לא יופיע אם יש אירועים בהמתנה. במילים אחרות, בהנחה שאין הפרעות בלתי צפויות, עובדי שירות של תוספים בדרך כלל נשארים בחיים כל עוד הם מעבדים אירועים באופן פעיל. בנוסף, קריאות לממשקי API ספציפיים של Chrome, כמו chrome.storage.local.get(), יאפסו את הזמן הקצוב לתפוגה שהוגדר לחוסר פעילות. פרטים נוספים:

  • קובץ השירות (service worker) מפסיק לפעול לאחר 30 שניות של חוסר פעילות. (קבלת אירוע או התקשרות לתוסף API יגרמו לאיפוס הטיימר הזה).
  • קובץ השירות (service worker) מפסיק אם העיבוד של בקשה בודדת, כמו אירוע או קריאה ל-API, נמשך יותר מ-5 דקות.

ממשקי API מסוימים, כמו העברת הודעות מקומית, מספקים פעולת keep-alive חזקה שמבטלת את שני הטיימרים האלה.

אנחנו עדיין פועלים כדי לוודא שה-service worker של ההרחבות ייסגרו כשהדבר יתאפשר, מבלי להשבית את העבודה הממושכת. עובדי שירות של הרחבה שמתמקדים במשאבים צריכים תמיד להעניק שירות כשאפשר. בנוסף, התוספים צריכים להתכונן לסגירה בלתי צפויה באמצעות מצב מתמשך. כך ניתן להגן מפני אירועים לא צפויים כמו סגירה כפויה של הדפדפן על ידי המשתמש.

תמונה מאת Paula Guerreiro ב-UnFlood