Längere Lebensdauer der Extension Service Worker

Service Worker für Erweiterungen können jetzt aktiv bleiben, solange sie Ereignisse empfangen. Dies erhöht die Zuverlässigkeit der Worker für Erweiterungsdienste, es gibt jedoch einen Fallstrick, den Sie vermeiden sollten.

Joe Medley
Joe Medley

Ab Chrome 110 (Beta seit dem 7. Februar 2023) bleiben die Worker von Erweiterungsdiensten aktiv, solange sie Ereignisse empfangen. Dadurch wird ein Zeitproblem in der vorherigen Implementierung von Erweiterungsdienst-Workern behoben. Es war möglich, dass Zeitüberschreitungen auftraten, wenn sich neue Ereignisse in der Ereigniswarteschlange befanden, und dass die Zeitüberschreitungen asynchrone Arbeit kürzen ließen. Diese Verbesserung beseitigt die harte maximale Lebensdauer von 5 Minuten für Worker für Erweiterungen.

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

Hintergrund

Service Worker der Erweiterung verhalten sich größtenteils wie Webdienst-Worker, sie können jedoch neben Service Worker-Ereignissen auch Erweiterungsereignisse überwachen. Während normale Service Worker-Ereignisse die Lebensdauer des Service Workers verlängern, blieb der Extension Service Worker vor der Veröffentlichung von 110 nur durch wenige Ereignisse der Erweiterungsplattform aktiv.

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

  • Der Service Worker hat länger als 30 Sekunden kein Ereignis erhalten und es sind keine ausstehenden Aufgaben mit langer Ausführungszeit in Bearbeitung. Wenn ein Service Worker während dieser Zeit ein Ereignis erhalten hat, wurde der Timer für Inaktivität entfernt.
  • Eine lang andauernde Aufgabe hat mehr als fünf Minuten gedauert und in den letzten 30 Sekunden wurden keine Ereignisse empfangen.

Neue Service Worker-Ereignisse, die vor Ablauf des Timers für die Inaktivität oder vor Ablauf des Timers für die Aufgaben eingehen, würden die Timer zurücksetzen und die Lebensdauer des Service Workers verlängern.

Dieses Verhalten traf leider nicht auf Erweiterungsereignisse zu. Durch Erweiterungsereignisse könnte ein Erweiterungs-Service-Worker aktiviert und aktiv bleiben, bis das Ereignis abgeschlossen ist. Der 30-sekündige Inaktivitäts-Timer konnte jedoch nicht verlängert werden. Das bedeutete, dass die Worker der Erweiterung nach Abschluss des letzten Erweiterungsereignisses jederzeit beendet werden konnten, selbst wenn der Browser gerade erst ein neues Ereignis an die Erweiterung gesendet hätte.

Was sich geändert hat

Ab Chrome 110 wird der Timer für die Inaktivität durch alle Ereignisse zurückgesetzt. Bei ausstehenden Ereignissen tritt das Zeitlimit bei Inaktivität nicht auf. Anders ausgedrückt: Wenn es keine unerwarteten Unterbrechungen gibt, bleiben die Erweiterungs-Service-Worker jetzt aktiv, solange sie aktiv Ereignisse verarbeiten. Außerdem wird durch Aufrufe von erweiterungsspezifischen Chrome-APIs wie chrome.storage.local.get() das Zeitlimit bei Inaktivität zurückgesetzt. Insbesondere:

  • Der Service Worker wird nach 30 Sekunden Inaktivität beendet. Der Empfang eines Ereignisses oder das Aufrufen einer Erweiterungs-API setzt diesen Timer zurück.
  • Der Service Worker wird beendet, wenn die Verarbeitung einer einzelnen Anfrage, z. B. eines Ereignisses oder eines API-Aufrufs, länger als 5 Minuten dauert.

Einige APIs wie natives Messaging bieten ein starkes Keep-Alive, das beide Timer abbrechen.

Wir arbeiten weiterhin daran, dass die Worker von Erweiterungsdiensten möglichst beendet werden, ohne dabei lang andauernde Aufgaben zu beenden. Ressourcenbewusste Erweiterungsdienst-Worker sollten nach Möglichkeit immer Ergebnisse liefern. Außerdem sollten Erweiterungen durch den persistenten Status auf eine unerwartete Beendigung vorbereitet sein. Dies schützt vor unvorhersehbaren Ereignissen wie dem erzwungenen Schließen des Browsers durch den Nutzer.

Foto von Paula Guerreiro auf Unsplash