Веб-сокеты и реальное время

Разработка real-time функционала на веб-сокетах часто оборачивается непредвиденными тратами. Многие проекты списывают перерасход на «сложность технологии», хотя реальные причины — ошибки в выборе протокола, игнорирование стоимости поддержки длинных соединений и неверный расчёт сетевой нагрузки. В этом материале мы разложим экономику веб-сокетов по полочкам: от цены одного сообщения до бюджета на DevOps сопровождение. Вы узнаете, как уменьшить TCO (Total Cost of Ownership) real-time решения на 30-50% без потери скорости доставки данных.
- Стоимость одного WebSocket-соединения в облаке (AWS/GCP/Azure): постоянное TCP-соединение потребляет ~2-3 КБ оперативной памяти на стороне балансировщика и ~5-7 КБ на сервере приложений. Для 10 000 одновременных клиентов это минимум 70 МБ ОЗУ только на поддержку сокетов. Если вы используете ALB (Application Load Balancer) — добавьте $0.008 за каждый час активного соединения сверх лимита. В итоге 10 000 соединений в месяц обойдутся в $57–120 только за балансировку.
- Цена «пустого» keepalive-трафика: стандартный пинг-понг каждые 30 секунд генерирует 60 байт в минуту на одно соединение. Для 5000 пользователей это ~432 МБ входящего и исходящего трафика в день. По тарифам AWS EC2 (первые 100 ГБ бесплатно, затем $0.09/ГБ) вы заплатите ~$11 в месяц только за поддержание «спящих» соединений. Оптимизация интервала до 120 секунд снижает эту цифру в 4 раза.
- Скрытые затраты на переподключение (reconnect storm): при кратковременном сбое сети тысячи клиентов одновременно инициируют handshake. Каждое переподключение — 3 пакета TCP (SYN, SYN-ACK, ACK) плюс HTTP Upgrade заголовки (≈500 байт). При 50 000 единовременных переподключениях вы получаете ~25 МБ служебного трафика за 1-2 секунды и пиковую нагрузку на CPU сервера. Это может спровоцировать дополнительное масштабирование (автоскейлинг), что увеличит счёт за облако на 15–25% в месяц.
- Разница в стоимости между WebSocket и SSE (Server-Sent Events): SSE не требует handshake для каждого клиента, работает поверх HTTP/2 и потребляет на 40–60% меньше ОЗУ на сервере (не нужно хранить состояние соединения). Если ваш сценарий — только отправка данных от сервера к клиенту (биржевые котировки, логи), то переход с WebSocket на SSE сокращает затраты на инфраструктуру в среднем на $0.02 за каждые 1000 сообщений.
- Цена WebSocket против Polling в реальном проекте: в одном из кейсов (чат-бот на 3000 пользователей) замена HTTP Long Polling на WebSocket уменьшила сетевой трафик с 3.2 ГБ до 0.47 ГБ в день. При тарифе $0.12/ГБ (исходящий) экономия составила $98.28 в месяц. Но добавилась стоимость WebSocket-сервера: Node.js с библиотекой ws потребовал $25/мес ( +$7 за балансировщик). Итоговая экономия — $66.28/мес. Minus затраты на рефакторинг (40 часов разработчика — ~$2000) — окупаемость наступила на 7-й месяц.
Ключевой фактор, напрямую влияющий на итоговую стоимость real-time системы — это выбор протокола и архитектуры обмена сообщениями. Большинство разработчиков слепо выбирают WebSocket из-за модного статуса, хотя для односторонней рассылки дешевле использовать SSE, а для синхронизации состояния — CRDT с бекендом на Redis Pub/Sub. Далее разберём три основных сценария, где цена ошибки достигает $500–2000 в месяц.
Первый сценарий — «всеобщий broadcast». Если каждый пользователь отправляет сообщение всем остальным (как в командных каналах Slack), то при 5000 пользователях через WebSocket вы генерируете 25 миллионов message-событий в час. Обработка такого потока на виртуальной машине Standard_D2s_v3 (Azure, $70.08/мес) приводит к 100% загрузке CPU уже на 12-й минуте. Решение: использовать Redis Streams или брокер сообщений (RabbitMQ) с топиками — это добавит $35–50 к бюджету, но снизит нагрузку на WebSocket-сервер в 8–10 раз. Экономия на масштабировании: не нужна вторая VM.
Watcher-эффект: как один клиент-наблюдатель умножает счёт за трафик
В real-time системах часто используется паттерн «scrutineer» — один клиент (мониторинг, дашборд менеджера) подписывается на все изменения. Если этот клиент использует WebSocket и получает каждое обновление, то при 2000 активных записях на сервере и частоте изменений 1 раз в секунду трафик подписчика составит ~6.8 МБ/мин или 9.7 ГБ в сутки. При стандартной цене исходящего трафика $0.09/ГБ (AWS) это $26.2 в месяц только на одного наблюдателя. Решение: внедрить агрегацию событий на сервере (batch-отправка раз в 5 секунд) — трафик падает до 1.94 ГБ/сутки ($5.24/мес). Или перевести наблюдателя на SSE: экономия составит ещё 20% за счёт меньшего оверхэда заголовков.
- Оптимизация «ленивый подписчик»: клиент, который не активен (вкладка не в фокусе, окно свёрнуто), не должен получать полный поток. Page Visibility API + debounce на стороне клиента снижают трафик на таких наблюдателях на 70–90%. Для команды из 100 менеджеров с дашбордами экономия — до $187/мес при трафике 0.08 $/ГБ.
- Gzip/Deflate для WebSocket-фреймов: permessage-deflate extension сжимает payload на 50–70% для JSON-данных. На проекте с 5000 сообщений/мин сжатие снизило расход трафика с 2.1 ГБ до 0.63 ГБ в день. При $0.10/ГБ — $4.41/мес экономии. Но включение deflate увеличивает задержку на 2–5 мс и нагружает CPU на 15%. Баланс: выгодно при размере сообщения >4 КБ.
- Стоимость «вечнозелёных» соединений через Cloudflare Workers®: использование глобальной сети доставки для WebSocket снижает нагрузку на основной сервер, но требует платы за количество запросов (Workers Unbound — $0.15/млн запросов). Для сервиса с 10 млн сообщений в день — доп. $1.5/день. При этом вы экономите на каждом 4-м запросе за счёт кэширования заголовков и маршрутизации. Реальная экономия: ~$0.007/1000 сообщений.
Масштабирование WebSocket: цена горизонтального расширения
Когда одно WebSocket-соединение требует привязки к конкретному серверу (sticky sessions), вы не можете просто добавить новый инстанс — нужно перераспределять клиентов. Каждый новый сервер (t3.medium, $30/мес) уменьшает нагрузку, но добавляет сложность синхронизации состояний. Выход — внешний Pub/Sub брокер (Redis, RabbitMQ, Kafka). Стоимость Redis Cache Standard C1 (1 ГБ): $55/мес на AWS. Если у вас 5 серверов WebSocket, замена внутреннего обмена сообщениями на Redis снижает необходимость в 6-м сервере (экономия $30/мес — фактически Redis «окупает» себя за 2 месяца).
- Цена ошибки выбора библиотеки WebSocket: использование ws (Node.js) против uWebSockets (C++). На 10 000 одновременных соединений uWebSockets потребляет 55 МБ ОЗУ против 210 МБ у ws. Разница в стоимости памяти на облаке (Dedicated Host plan): $0.000015/МБ/ч → (210-55)*0.000015*730 = ~$1.70/мес экономии. Важнее — CPU: uWebSockets обрабатывает 1 млн сообщений за 0.4 сек, ws — 2.1 сек. Это снижает необходимость в дополнительном core (минус $25–40/мес).
- Hidden cost WebSocket в Kubernetes: каждый WebSocket-порт при работе через Ingress (NGINX, Traefik) требует настройки сохранения соединений (sticky sessions). Ingress-контроллер с 5000 сокетов потребляет на 30% больше памяти, чем обычный HTTP. Платите за размер подов: 80 мB дополнительно на каждые 1000 соединений. Для 3 подов с балансировкой — $12.6/мес скрытых затрат на память. Решение: использовать ClusterIP + прямой доступ к Pod через hostPort, что экономит ~$5/мес на каждом ингрессе.
Автоскейлинг real-time: как не переплачивать за резерв
Типичная ошибка — настраивать HPA (Horizontal Pod Autoscaler) по CPU, а не по количеству открытых сокетов. При пиковой нагрузке CPU может проседать из-за I/O, и автоскейлинг не сработает вовремя — пользователи теряют соединение, переподключаются, создают лавину. Альтернатива: метрика на основе custom metric «ws_connections_count». Это позволяет держать коэффициент использования ресурсов на уровне 85% (против 50% при стандартном подходе). Экономия на резервировании: для кластера из 10 нод вы не держите 5 лишних «на всякий случай» — минус $250/мес (по $50 за ноду t3.medium).
Пример из практики: финтех-дашборд с 3000 параллельных подключений перешёл с CPU-based автоскейлинга на custom metric. Количество нод сократилось с 6 до 3, средняя загрузка CPU выросла с 30% до 85%. Счёт за Kubernetes упал с $480 до $260/мес. При этом время восстановления после пика снизилось с 90 секунд до 12 секунд. HPA accuracy выросла на 35%.
WebSocket в бедных каналах: цена региональной задержки
Если ваши пользователи находятся в регионах с высоким ping (Юго-Восточная Азия, Латинская Америка), каждый keepalive-пакет теряется чаще, что приводит к переподключениям. Для клиента с RTT 300 мс при интервале keepalive 30 секунд вероятность разрыва соединения за час — 18%. После 10 часов работы останется только 13% первоначальных соединений. Постоянные переподключения генерируют лишние 40–50 КБ трафика на каждого клиента в день. При 1000 пользователях — 40–50 МБ «мусорного» трафика ежедневно, что добавляет $1.2–1.5/мес на трафик. Решение: увеличить keepalive до 120 секунд и настроить exponential backoff при reconnect. Экономия: снижение reconnect-трафика на 85%.
Дополнительно: TCP Fast Open сокращает время handshake с 300 мс до 150 мс для повторных подключений. Включение этой опции на сервере (Linux sysctl) снижает количество потерянных соединений на 12–18%, что эквивалентно экономии $0.9–1.2 на каждые 1000 клиентов в месяц за счёт уменьшения повторных открытий сокетов.
Референс: формула расчёта TCO для real-time приложения на WebSocket
Чтобы оценить бюджет, используйте следующую метрику: TCO_ws = (C_con * N) + (D_byte * P_e) + (H_ops * R_h) + M_sync. Где C_con — стоимость одного соединения в час (включая балансировщик и память), N — число одновременных клиентов, D_byte — дневной объём трафика (в ГБ), P_e — цена за ГБ (еgress, $0.08–0.12), H_ops — количество handshake-операций в день, R_h — цена одного handshake ($0.000003–0.000008), M_sync — стоимость синхронизации состояний (Redis/брокер). Поделите на 730 (часов в месяц) — получите ежемесячный бюджет. Например: (0.012*5000) + (15*0.10) + (50000*0.000005) + 55 = $60 + $1.5 + $0.25 + $55 = $116.75/мес. Если ваш реальный счёт превышает эту цифру на 20%+ — ищите скрытый leak.
Средняя переплата в проектах, которые не считают TCO по этой формуле, составляет 47%. Для типичного стартапа с 5000 DAU это $55–90 ежемесячно уходит на неоптимизированные соединения и избыточный трафик. Исправление трёх основных факторов (интервал keepalive, сжатие, выбор протокола) сокращает TCO до расчетной цифры за 2–3 недели.
Добавлено: 23.04.2026
