Несколько вкладок опрашивают сервер: как оставить одну
Чтобы несколько вкладок не выполняли одинаковый опрос сервера, выделите одного исполнителя через Web Locks API, а результаты передавайте остальным через BroadcastChannel. Это две разные задачи: блокировка координирует работу, канал доставляет сообщения. Отдельно нужны начальная синхронизация новой вкладки и поведение при остановке исполнителя.
Какую работу действительно можно сделать общей
Объединять стоит чтение одинакового набора данных в одном пользовательском контексте. Если вкладки открыли разные организации, фильтры или записи, один результат может им не подходить. Перед выбором API опишите ключ общей задачи: что читаем, с какими условиями и для кого.
Снижение количества запросов не должно смешивать данные разных сессий. Смена пользователя или рабочей области требует остановить прежнюю общую работу и проверить границы нового состояния. В имени канала или блокировки не нужны пароли и токены: служебный ключ не является средством авторизации.
Блокировка живёт столько, сколько выполняется задача
В описании Web Locks API на MDN показано получение именованной блокировки и её освобождение после завершения задачи. API доступен в поддерживающих его безопасных контекстах. Это локальная координация браузерных контекстов, а не блокировка серверного ресурса на всех устройствах.
Для длительного опроса недостаточно получить lock, запустить отдельный таймер и сразу завершить callback. В таком устройстве программы право на общую работу освобождается раньше самой работы. Жизненный цикл callback должен охватывать выбранный период исполнения и его корректное завершение.
В спецификации Web Locks описаны запросы и выдача блокировок. Для приложения поверх этого механизма всё равно нужны собственные решения: имя задачи, начало опроса, условия остановки и обработка ошибок. Наличие lock не устанавливает их автоматически.
Канал сообщений не заменяет выбор исполнителя
BroadcastChannel позволяет подходящим браузерным контекстам обмениваться сообщениями. MDN отдельно уточняет ограничение общей storage partition. Поэтому нельзя обещать связь любых страниц только на основании похожего адреса или одного названия канала.
Само сообщение «я исполнитель» не даёт исключительного права выполнять опрос. Две вкладки могут начать работу одновременно, если ваше правило выбора на этом заканчивается. Используйте отдельный механизм координации и отдельный протокол обмена результатами, не приписывая каналу функции блокировки.
Учебный жизненный цикл трёх вкладок
Предположим, вкладки А и Б показывают один список задач. Затем открывается В, а А штатно прекращает общую работу. Это вымышленная схема для проектирования и приёмки, а не измерение производительности конкретного продукта. Интервал опроса здесь намеренно не задан как универсальная норма.
| Состояние | Кто опрашивает | Что получают остальные | Что важно проверить |
|---|---|---|---|
| А получила право, Б ожидает | А, пока держит нужную блокировку | Подтверждённые результаты для общего ключа | Б не запускает параллельный такой же цикл |
| Открылась новая В | Прежний исполнитель | В запрашивает текущий снимок или получает его предусмотренным способом | В не ждёт бесконечно неизвестную прошлую рассылку |
| Пришла ошибка чтения | Текущий исполнитель по правилу повторов | Состояние ошибки и известная актуальность прежних данных | Нет мгновенного самостоятельного опроса из всех вкладок |
| А штатно завершила работу | Следующая получившая право вкладка | Новый подтверждённый результат | Старый цикл остановлен до появления второго |
| Исполнитель не отвечает после фонового перехода | Определяется предусмотренным сценарием деградации | Явный статус неподтверждённой свежести | Отсутствие сообщения не принято за доказанное освобождение lock |
Как новая вкладка узнаёт текущее состояние
Рассылка результата не равна хранилищу истории. Не проектируйте новую вкладку так, будто она обязана получить сообщение, отправленное до её подключения. Определите отдельный запрос текущего снимка или начальное чтение по согласованному правилу.
Ответ должен содержать ключ набора данных и признак версии либо другой выбранный способ проверки актуальности. Получатель сверяет, что результат относится к его текущей рабочей области. Локальное время отправки удобно для наблюдения, но не обязано задавать порядок изменений серверной записи.
Решите, как обрабатывается совпадение начального чтения и очередной рассылки. Если поздно пришёл более старый снимок, он не должен молча затереть подтверждённое новое состояние. Сам формат сообщения и правило сравнения версий нужно определить в приложении.
Что происходит при ошибке и уходе вкладки
Разделите сетевой отказ, штатную остановку и отсутствие активности исполнителя. В первом случае может требоваться ограниченный повтор, во втором — освобождение ресурсов, в третьем — диагностика. Эти состояния нельзя свести к правилу «нет сообщений — всем немедленно начать опрос».
Не обещайте точный интервал фоновой работы только потому, что таймер создан. Для состояния без подтверждённой свежести задайте видимое поведение: оставить прежние данные с отметкой, предложить обновление или ограничить зависящее от актуальности действие. Выбор зависит от задачи продукта.
При прекращении участия вкладка должна убрать ненужные обработчики и таймеры, завершить свою работу с каналом. Проверяйте также исключение внутри цикла: право на работу и связанные ресурсы не должны остаться в противоречивом состоянии из-за неучтённой ошибки.
Как проверить решение без обманчивого счётчика
- Выберите одинаковый набор данных и подпишите ключ общей задачи.
- Откройте несколько вкладок и проверьте, какая получила право опроса и когда оно заканчивается.
- Сверьте серверные запросы и получение одного результата остальными вкладками.
- Добавьте новую вкладку между рассылками и проверьте получение текущего состояния.
- Завершите исполнителя, затем проверьте сетевую ошибку и фоновый переход отдельно.
- Проверьте смену пользователя, рабочей области и неподдерживаемый API в согласованных браузерах.
Сравнивать нужно не только количество запросов, но и корректность экрана. Один запрос на все вкладки бесполезен, если новая вкладка остаётся пустой или получает результат другой организации. План проверки выше нужно выполнить в тестовой среде; готовых измерений вашего приложения в статье нет.
Что такое решение не защищает
Другой браузер и другое устройство имеют собственную работу. Проверка прав, лимиты и допустимость изменений остаются на сервере. Клиентская блокировка чтения не заменяет серверную защиту от повторного проведения бизнес-операции.
При разработке веб-приложения эту координацию можно описать отдельным требованием. Для доработки интерфейса пригодятся ключ общей задачи и сценарии остановки. В API-интеграции отдельно задайте значение версии результата и условия повторного чтения.
Если целевая среда не поддерживает выбранный механизм, заранее согласуйте упрощённое поведение. Прозрачный ограниченный запасной сценарий лучше обещания единственного опроса, которое проверено только в одном браузере и ломается при обычном открытии новой вкладки.
Вопросы и ответы
Что такое Web Locks API в задаче нескольких вкладок?
Это браузерный механизм координации доступа к именованной работе или ресурсу в его области действия. Для общего опроса приложение должно удерживать право в течение самой работы, а не только при запуске таймера.
Чем BroadcastChannel отличается от Web Locks?
Канал используется для сообщений между подходящими контекстами, а блокировка — для координации выполнения. Сам канал не выбирает единственного исполнителя и не задаёт протокол начального состояния новой вкладки.
Как проверить поддержку Web Locks в Safari и других браузерах?
Сверьте совместимость для используемых версий и проверьте наличие API в своей среде. Затем выполните сценарии получения права, остановки и деградации; одно наличие свойства не подтверждает корректность вашей схемы.
Читайте также
Приложение Bubble на своём сервере: что придётся переделать
РазработкаHydration mismatch: почему сервер и браузер видят разное
КомментарииJava 27: что проверить владельцу серверного приложения
КомментарииMySQL 26.10: сервер и драйвер обновляются по разным правилам
КомментарииValkey о FakeValkey: что зелёные тесты без сервера не проверят
КомментарииNuxt 4.6: что меняет отдельный API серверного кода