Чому патерн вкладки-лідера більше не ідеальний
Коли користувач відкриває складний вебсервіс у кількох вкладках — будь-то CRM, фінансовий дашборд чи трекер замовлень — кожна вкладка намагається відкрити власний WebSocket. Запуск десятків одночасних сокет-з'єднань для одного клієнта перевантажує як серверний кластер, так і пам'ять браузера.
Довгий час класичним вирішенням цієї проблеми був патерн вибору лідера: за допомогою Web Locks API (navigator.locks) одна з вкладок стає головною, відкриває єдиний сокет і транслює дані іншим через BroadcastChannel. Це робочий підхід, але він має архітектурну вразливість. З'єднання фізично прив'язане до конкретного документа. Щойно користувач закриває лідер-вкладку, браузер повинен провести нове голосування, призначити наступника та заново ініціювати повний цикл рукостискання WebSocket. Для сервісів із чутливими реальними даними (котирування, онлайн-чати, спільне редагування) секундна затримка передачі даних є неприпустимою.
SharedWorker: з'єднання поза контекстом сторінки
Існує спосіб відокремити життєвий цикл сокета від життя окремих вкладок. Для цього команда ViAcore використовує SharedWorker — окремий фоновий потік JavaScript, до якого одночасно можуть звертатися кілька вкладок одного домену.
Як працює цей підхід:
- Ізольований контекст: воркер створюється під час запиту першої вкладки й продовжує жити незалежно, доки відкрита бодай одна сторінка.
- Спільна шина даних: кожна нова вкладка підключається через власний
MessagePort. - Нульовий час простою: закриття будь-якої сторінки, навіть тієї, що відкрилася першою, ніяк не впливає на активний WebSocket. З'єднання не перезапускається, тому втрати пакетів не відбувається.
Нюанси реалізації та керування життєвим циклом
На відміну від блокувань у navigator.locks, які браузер звільняє автоматично в момент знищення сторінки, SharedWorker не отримує нативної події про закриття порта. Якщо просто зберігати посилання у списку Set, закриті порти залишатимуться в пам'яті до спрацьовування збирача сміття.
Щоб контролювати кількість активних підключень і коректно гасити сокет, коли клієнт повністю закрив застосунок, варто передавати подію прощання:
- На рівні клієнтської вкладки підписуємося на
pagehideта надсилаємо повідомлення про завершення сесії. - У воркері видаляємо відповідний порт із реєстру.
- Коли кількість активних портів досягає нуля, викликаємо планове закриття сокета на стороні сервера.
Стратегія підтримки та бізнес-ефект
Використання SharedWorker суттєво зменшує навантаження на інфраструктуру: сервер утримує лише одне з'єднання на кожного реального користувача замість десятків дублікатів. Це гарантує миттєву синхронізацію даних без фризів під час навігації вкладками.
З точки зору підтримки платформами, технологія стабільно працює в усіх десктопних браузерах і сучасних версіях Safari для iOS. Для специфічних мобільних оточень раціонально використовувати прогресивне покращення: використовувати SharedWorker за замовчуванням, а як фолбек — повертатися до зв'язки Locks API та BroadcastChannel.
Послуги з цієї теми
Лендінг під ключ
Продаючий лендінг під ключ: оффер, структура, дизайн, розробка, SEO-техоснова та запуск реклами. Від 10 000 грн.
від 10 000 грн
Корпоративний сайт
Корпоративний сайт під ключ: презентація компанії, каталог послуг, CRM, адмін-панель, SEO-структура. Від 18 000 грн.
від 18 000 грн
Інтернет-магазин
Інтернет-магазин під ключ: каталог товарів, кошик, онлайн-оплата, інтеграції з CRM та складом, SEO-структура. Від 25 000 грн.
від 25 000 грн
Потрібно таке для вашого проєкту?
Розробка під ключ: аналіз → реалізація → запуск → підтримка. Розкажіть про задачу — відповімо з оцінкою.
Релевантні статті
Надійна архітектура чату підтримки: сесії, статуси присутності та гарантії доставки
Як спроєктувати бекенд чату підтримки для логістики та B2B-сервісів без втрати повідомлень, хибних статусів «онлайн» та вразливостей авторизації.
Оптимізація INP на Shopify: практичний посібник з покращення відгуку теми
Дізнайтеся, як оптимізувати метрику Interaction to Next Paint (INP) на Shopify, усунути зависання інтерфейсу та підвищити конверсію вашого магазину.
Як подолати ефект якоря в оцінці завдань: архітектура реального часу для командних мітингів
Дізнайтеся, як правильна WebSocket-архітектура та сліпе голосування усувають ефект якоря під час оцінки завдань розробниками.
Графовий аналіз та AI: як скоротити час простою бізнесу під час критичних збоїв
Дізнайтеся, як поєднання графових баз даних та AI дозволяє виявляти першопричини системних аварій за секунди замість годин ручного розбору логів.