Сотрудники службы распространения знаний теперь могут оставаться в живых, пока они получают события. Это повышает надежность работников служб распространения знаний, но содержит ловушку, которую следует избегать.
Начиная с Chrome 110 (бета-версия по состоянию на 7 февраля 2023 г.), работники служб расширений остаются в живых, пока они получают события. Это исправляет проблему синхронизации в предыдущей реализации работников службы расширения. Тайм-ауты могли возникать, когда в очереди событий находились новые события, и тайм-ауты усекали асинхронную работу. Это улучшение устраняет жесткий пятиминутный максимальный срок службы для сотрудников службы распространения знаний.
В этой статье описывается, как изменилось это поведение.
Фон
Работники службы расширения в основном ведут себя как работники веб-службы, но в дополнение к событиям работника службы работники службы расширения также могут прослушивать события расширения. В то время как обычные события Service Worker продлевают срок службы Service Worker, до выпуска 110 только несколько событий платформы расширений поддерживали работу Service Worker.
Обычно Chromium завершает работу сервис-воркера после выполнения одного из следующих условий:
- Работник службы не получал события более тридцати секунд, и не выполняется никаких невыполненных долгосрочных задач. Если работник службы получал событие в течение этого времени, таймер простоя удалялся.
- Выполнение длительной задачи заняло более пяти минут, и за последние тридцать секунд не было получено никаких событий.
Новые события сервисного работника, полученные до истечения срока действия таймера простоя или таймера длительной задачи, сбрасывают таймеры и продлевают срок службы сервисного работника.
К сожалению, такое поведение не применимо к событиям расширения. События расширения могут разбудить работника службы расширения и поддерживать его активность до завершения события, но они не могут продлить тридцатисекундный таймер простоя. Фактически это означало, что работники службы расширений могли быть прекращены в любое время после завершения последнего события расширения, даже если браузер только что отправил расширение новое событие.
Что изменилось
Начиная с Chrome 110, все события сбрасывают таймер простоя, и тайм-аут простоя не происходит, если есть ожидающие события. Другими словами, при условии отсутствия неожиданных сбоев, работники службы расширения обычно остаются в живых до тех пор, пока они активно обрабатывают события. Кроме того, вызовы API-интерфейсов Chrome, специфичных для расширения, таких как chrome.storage.local.get()
, сбрасывают тайм-аут простоя. Конкретно:
- Сервисный работник завершает работу через 30 секунд бездействия. (Получение события или вызов API расширения сбрасывает этот таймер).
- Работник службы завершает работу, если обработка одного запроса, например события или вызова API, занимает более 5 минут.
Некоторые API, такие как встроенный обмен сообщениями, обеспечивают надежную поддержку активности, которая отменяет оба этих таймера.
Мы все еще работаем над тем, чтобы работники службы расширения увольнялись, когда это возможно, без остановки длительной работы. Работники службы распространения знаний, заботящиеся о ресурсах, всегда должны уступать, когда это возможно. Кроме того, расширения должны быть готовы к неожиданному завершению, сохраняя состояние. Это защищает от непредсказуемых событий, таких как принудительное закрытие браузера пользователем.
Фото Паулы Геррейро на Unsplash