WebSocket не нужен. Почти всегда. WebSocket создаёт иллюзию простоты: постоянное соединение, двусторонняя связь, никакой лишней обёртки. Но на практике это тяжёлый протокол и почти всегда избыточный.

Постоянное соединение — не бесплатное.

Каждое соединение — это: – выделенный TCP-сокет – память на буферы и таймеры – регулярные ping/pong пакеты – необходимость держать пользовательский state на сервере

При 100k подключениях в idle: – память: 300–500 МБ (Node.js, uWebSockets.js) – CPU: ~7% просто на поддержание соединений – одна массовая рассылка может триггерить GC и просадку latency

Масштабирование WebSocket — отдельная боль: – Sticky-сессии обязательны (иначе нельзя писать адресно) – Горизонтальное масштабирование требует внешнего pub/sub – Протокол не работает через CDN – Никаких встроенных ack, retry, QoS В большинстве задач WebSocket не нужен вообще. Альтернативы проще, стабильнее, масштабируются лучше:

EventSource (SSE) Односторонний канал server → client. HTTP/1.1, простой протокол, балансируется обычным nginx. Подходит для realtime фидов, алертов, обновлений UI.

Long polling Рабочий вариант. HTTP-запрос держится открытым до появления данных. Поддерживает edge-кеш, не требует сложной инфраструктуры.

Push через REST + CDN Если данные можно кешировать даже на 1–2 секунды — дешевле отправить через pull-модель. REST + Cloudflare/Fastly + max-age — и клиент почти в real-time.

MQTT / raw TCP Когда реально нужен duplex и контроль — лучше уйти на уровень ниже. Там можно сделать свой протокол с ack, QoS, batching.

WebSocket — это не default. Это инструмент для узкого класса задач: двусторонняя синхронизация, RTC, редакторы, игры.

Во всех остальных случаях он добавляет ресурсоёмкость, сложность и архитектурные ограничения. Без реальной пользы. Если можно не держать соединение — не держи.