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 и что изменится в архитектуре?

Связанные уроки

  • sd-03-scalability
Cost Optimization

0

1

Войти