Длительный процесс внутри Рабочего Рабочего (или что-то подобное)

У меня есть клиентское JS-приложение, которое использует IndexedDB для хранения своего состояния. Работает отлично. Тем не менее, он медленный, потому что я часто читаю и записываю в IndexedDB, чтобы состояние не становилось несогласованным, когда открываются несколько вкладок.

Моя идея заключалась в том, что... все элементы доступа к базе данных внутри Service Worker, а затем я могу кэшировать значения там в памяти, не беспокоясь о том, что другая вкладка могла изменить базу данных.

Кажется, что все работает нормально, за исключением того, что некоторые части моего приложения занимают много времени. Я могу сообщить статус (например, "X% done" ) от Рабочего Рабочего в мой пользовательский интерфейс. Но как Firefox, так и Chrome, похоже, убивают рабочего, если он работает более 30 секунд, что слишком мало для меня.

Есть ли способ ограничить это ограничение? Если нет, то идеи для достижения чего-то подобного? Я думаю, что совлокальный рабочий может сделать это, за исключением поддержки браузеров, и я не ожидаю, что теперь это улучшится с учетом рабочих-служб.

Ответ 1

В итоге я использовал общий рабочий. В браузерах, которые не поддерживают общих работников, таких как Edge и Safari, я возвращаюсь к веб-рабочему и некоторому взломанному коду, чтобы вы только открывали приложение на одной вкладке за раз.

Поскольку 90% моих пользователей находятся в Firefox или Chrome, я считаю, что это не огромная потеря.

Я также написал библиотеку для (среди прочего) нормализации API-интерфейсов, используемых в общих рабочих и веб-рабочих, поэтому у меня есть точная тот же код работает в обоих сценариях, единственное различие заключается в том, инициализирован ли рабочий с помощью Worker или SharedWorker.

Ответ 2

Документация Google для сервисных работников говорит нам, что использование рабочих сервисов в качестве кеша памяти невозможно:

Он прекращается, когда он не используется, и перезапускается, когда он нужен в следующий раз, поэтому вы не можете полагаться на глобальное состояние в обработчиках onfetch и onmessage рабочего. Если есть информация, которую необходимо сохранить и повторно использовать во всех перезагрузках, у рабочих служб есть доступ к API IndexedDB.

Мое предложение - продолжать использовать сервис-работников для сохранения данных в базе данных и использовать localStorage для создания общего кэша между страницами. Вкладка, вносящая изменения, затем отвечает за обновление кеша в localStorage и сохранение в IndexedDB через рабочего.

Ответ 3

Как вы сказали, SharedWorkers, похоже, именно то, что вам нужно. Я не уверен, почему вы думаете, что импульс внедрения ServiceWorkers не позволяет браузерам поддерживать SharedWorkers. Кажется, это два разных вида животных.

Насколько я понимаю, ServiceWorkers следует использовать в качестве прокси для ваших запросов, когда ваше приложение отключено, а тяжелые вещи должны выполняться в WebWorkers и SharedWorkers

https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker