Längere Lebensdauer der Extension Service Worker

Erweiterungs-Dienstworker können jetzt so lange aktiv bleiben, wie sie Ereignisse empfangen. Dies erhöht die Zuverlässigkeit der Mitarbeiter von Erweiterungsdiensten, birgt aber eine Falle, die Sie vermeiden sollten.

Joe Medley
Joe Medley

Ab Chrome 110 (Betaversion seit dem 7. Februar 2023) bleiben Erweiterungs-Service-Worker aktiv, solange sie Ereignisse empfangen. Dadurch wird ein Zeitproblem bei der vorherigen Implementierung von Erweiterungs-Dienstworkern behoben. Es war möglich, dass Zeitüberschreitungen auftraten, wenn sich neue Ereignisse in der Ereigniswarteschlange befanden, und dass die Zeitüberschreitungen die asynchrone Arbeit abbrechen. Durch diese Verbesserung entfällt die maximale Lebensdauer von fünf Minuten für Worker des Erweiterungsdienstes.

In diesem Artikel wird beschrieben, wie sich diese Verhaltensweisen geändert haben.

Hintergrund

Erweiterungs-Service Worker verhalten sich größtenteils wie Web-Service Worker, können aber zusätzlich zu Service Worker-Ereignissen auch Erweiterungsereignisse überwachen. Normale Service Worker-Ereignisse verlängern die Lebensdauer des Service Workers. Vor der Veröffentlichung von 110 wurden Erweiterungs-Service Worker nur durch wenige Erweiterungsplattformereignisse am Leben gehalten.

Normalerweise beendet Chromium einen Dienst-Worker, wenn eine der folgenden Bedingungen erfüllt ist:

  • Der Dienst-Worker hat seit über 30 Sekunden kein Ereignis mehr empfangen und es sind keine ausstehenden langwierigen Aufgaben in Bearbeitung. Wenn ein Dienstarbeiter in dieser Zeit ein Ereignis empfing, wurde der Inaktivitätstimer entfernt.
  • Eine lang laufende Aufgabe hat mehr als fünf Minuten gedauert und in den letzten 30 Sekunden wurden keine Ereignisse empfangen.

Wenn neue Service Worker-Ereignisse vor Ablauf des Inaktivitätstimers oder des Timers für lang laufende Aufgaben eingehen, werden die Timer zurückgesetzt und die Lebensdauer des Service Workers verlängert.

Leider galt dieses Verhalten nicht für Erweiterungsereignisse. Erweiterungsereignisse konnten einen Erweiterungs-Dienst-Worker aktivieren und ihn so lange aktiv halten, bis das Ereignis abgeschlossen ist. Der Inaktivitätstimer von 30 Sekunden konnte jedoch nicht verlängert werden. Das bedeutete, dass Erweiterungs-Dienstworker jederzeit nach Abschluss des letzten Erweiterungsereignisses beendet werden konnten, auch wenn der Browser gerade ein neues Ereignis an die Erweiterung gesendet hatte.

Änderungen

Ab Chrome 110 wird der Inaktivitätstimer durch alle Ereignisse zurückgesetzt und die Inaktivitätsüberschreitung tritt nicht auf, wenn ausstehende Ereignisse vorhanden sind. Mit anderen Worten: Wenn keine unerwarteten Unterbrechungen auftreten, bleiben Erweiterungs-Dienst-Worker jetzt in der Regel aktiv, solange sie Ereignisse aktiv verarbeiten. Außerdem wird die Inaktivitäts-Zeitüberschreitung durch Aufrufe von Chrome-APIs für Erweiterungen wie chrome.storage.local.get() zurückgesetzt. Im Detail:

  • Der Dienst-Worker wird nach 30 Sekunden Inaktivität beendet. Wenn ein Ereignis empfangen oder eine Erweiterungs-API aufgerufen wird, wird dieser Timer zurückgesetzt.
  • Der Dienst-Worker wird beendet, wenn die Verarbeitung einer einzelnen Anfrage, z. B. eines Ereignisses oder API-Aufrufs, länger als 5 Minuten dauert.

Einige APIs wie native Messaging bieten ein starkes Keep-Alive, das beide Timer abbricht.

Wir arbeiten daran, dass Erweiterungs-Dienstarbeiter nach Möglichkeit beendet werden, ohne lang laufende Aufgaben zu beenden. Ressourcenbewusste Erweiterungs-Dienstworker sollten nach Möglichkeit immer zurückgeben. Außerdem sollten Erweiterungen auf eine unerwartete Beendigung vorbereitet sein, indem der Status beibehalten wird. So werden unvorhersehbare Ereignisse wie das erzwungene Schließen des Browsers durch den Nutzer verhindert.

Foto von Paula Guerreiro auf Unsplash