Real-Time Backend
Cost Optimization
Стартап с 5K пользователями платит USD 800/месяц за собственный WebSocket-кластер вместо USD 50/месяц через managed service. Разница в USD 750 в месяц - это engineering time потраченное на ops вместо product.
- Slack отключает mobile клиенты через 3 минуты неактивности и переключает на push-уведомления - при 30M DAU это экономит тысячи серверов так как большинство мобильных пользователей неактивны 80%+ времени
- Discord перешёл с Elixir на Rust для voice WebSocket и убрал 300 байт overhead на процесс - при 5M concurrent voice соединениях это сэкономило 1.5GB RAM на одном кластере
- Ably обслуживает 250 млрд сообщений в месяц - managed WebSocket часто выгоднее при менее 50K connections с учётом стоимости engineering time
Реальная стоимость WebSocket-соединения
Одно idle WebSocket соединение на Node.js потребляет 10-50KB heap (буферы, TLS state, HTTP parser state). При 10K соединений на процесс - от 100MB до 500MB только на соединения. Добавить приложение, Node.js runtime, V8 heap - и 2GB RAM заполняется быстро.
Но память - не единственная стоимость. File descriptor: каждое соединение занимает один fd. По умолчанию Linux ограничивает 1024 fd на процесс (`ulimit -n`). Для WebSocket-сервиса это нужно поднимать до 100K+.
Discord в 2020 описал оптимизацию перехода с Elixir на Rust для voice WebSocket: каждое Elixir process потребляло 300 байт overhead + message queue. При 5 млн concurrent voice соединений - 1.5GB только на process overhead. Rust убрал этот overhead полностью.
Что является основными компонентами стоимости одного idle WebSocket-соединения?
Idle Timeout: отключать неактивных клиентов
Мобильный клиент переключил приложение в фон. TCP-соединение остаётся живым (NAT не успел его закрыть), но пользователь не читает сообщения и не взаимодействует. Сервер держит fd, буферы, state - впустую.
Idle timeout + fallback стратегия: после N минут без активности сервер уведомляет клиента и закрывает соединение. Клиент переключается на polling каждые 30-60 секунд или ждёт push-уведомления для reconnect.
Slack отключает mobile клиенты через 3 минуты неактивности и переключает их на push-уведомления. При 30 млн daily active users это экономит тысячи серверов - большинство мобильных пользователей не активны 80%+ времени. WebSocket только когда приложение на переднем плане.
Как правильно реализовать idle timeout для mobile WebSocket клиентов?
Serverless Real-time: когда WebSocket слишком дорог
WebSocket требует постоянно работающих серверов. Serverless функции (Lambda, Cloud Functions) не держат состояние между вызовами - они не могут держать WebSocket-соединение. Но есть паттерны, которые дают real-time без WebSocket.
**Server-Sent Events (SSE)** через serverless: клиент держит долгоживущее HTTP соединение, сервер пишет события. AWS API Gateway поддерживает SSE нативно через Lambda response streaming. Но Lambda billing - за время выполнения функции. Для 10K idle SSE соединений - 10K Lambda invocations постоянно.
Ably (managed WebSocket platform) обслуживает 250 млрд сообщений в месяц. Цена: USD 0.00007 за 1000 сообщений. При 1M сообщений/день - USD 2100 в месяц. Собственный WebSocket кластер для того же объёма на AWS EC2 (c5.2xlarge x10) - USD 1400/месяц. Разница в 1.5x часто окупается отсутствием операционных расходов.
Почему AWS Lambda не подходит для прямого hosting WebSocket-соединений?
Сравнение стоимости: self-hosted vs managed
Правильное сравнение стоимости WebSocket-платформ включает не только infrastructure cost, но и engineering cost: setup, monitoring, scaling, failover, upgrades. Self-hosted дешевле на масштабе, managed - дешевле на старте.
Гибридный подход: managed service для dev/staging (нет постоянных расходов), self-hosted для production. Или: managed для real-time доставки (Ably/Pusher), собственная бизнес-логика в микросервисах.
- **< 1K connections** - managed service всегда выгоднее; self-hosted overhead не оправдан
- **1K-50K connections** - зависит от engineering capacity команды и стоимости ops
- **> 50K connections** - self-hosted обычно дешевле; managed pricing при таком масштабе значительный
- **> 1M connections** - гибридная архитектура или полный self-hosted с dedicated ops командой
Стоимость WebSocket-инфраструктуры определяется только ценой серверов
Полная стоимость включает compute, networking, engineering time на setup и ops, monitoring, failover, scaling
Engineering cost при self-hosted WebSocket при малом масштабе часто превышает экономию на compute. 2-3 дня на setup + ongoing ops могут стоить дороже managed service на годы вперёд.
При каком масштабе self-hosted WebSocket обычно становится выгоднее managed service?
Итоги
- Одно idle соединение: 10-50KB heap + один file descriptor; при 10K соединений - 100-500MB только на буферы
- Idle timeout с предупреждением за 30с экономит ресурсы для неактивных мобильных клиентов
- Managed WebSocket (Ably, Pusher) выгоднее при < 50K connections с учётом engineering cost; self-hosted - при большем масштабе
- Гибридный подход: managed для delivery, собственная бизнес-логика в микросервисах
Связанные темы
Cost optimization затрагивает все уровни WebSocket-архитектуры
- Edge Computing — Cloudflare Durable Objects с billing per-message vs EC2 с billing per-hour - принципиально разные модели
- Infrastructure (K8s) — HPA и правильные resource limits критичны для предсказуемой стоимости self-hosted кластера
- Feature Flags — Kill switch на heavy features снижает нагрузку и стоимость при пиковых событиях
- Chaos Engineering — Chaos experiments помогают найти неэффективное потребление ресурсов до того как оно станет дорогим
Вопросы для размышления
- Как рассчитать максимальное число соединений на поде зная доступную RAM и overhead на соединение?
- Когда стоит использовать Server-Sent Events вместо WebSocket с точки зрения стоимости инфраструктуры?
- Как изменится стоимость при переходе от 10K к 100K concurrent connections и что изменится в архитектуре?