Real-Time Backend
WebRTC масштабирование
Google Meet обслуживает миллионы одновременных звонков по всему миру. Один SFU в Virginia не справится - как строится глобальная медиаинфраструктура?
- **Livekit Cloud** - 20+ региональных PoP, клиент через latency measurement выбирает ближайший SFU, inter-region backbone на выделенных каналах, цена $0.001/минуту участника
- **Jitsi Octo** - cascading topology для webinar-scale: UN General Assembly использует Jitsi с Octo для трансляций 100K+ слушателей через несколько региональных нод
- **Cloudflare Calls** - WebRTC SFU на базе Cloudflare Workers и anycast network 300+ PoP, медиа входит в ближайший edge без управления собственной инфраструктурой
Cascading SFU
Один SFU обрабатывает порядка 500-1000 участников при типичной нагрузке (VP8, 720p). Для большой конференции на 5000+ участников нужна **cascading** (каскадная) архитектура: несколько SFU связаны между собой server-to-server соединениями, каждый держит свою группу клиентов, но форвардирует медиа между собой.
Механика: SFU-A соединяется с SFU-B через WebRTC или внутренний RTP тоннель. Когда пользователь на SFU-A говорит, его аудио/видео форвардируется на SFU-B, который раздаёт его своим клиентам. Связи между SFU минимальны: только активные потоки, не все участники всем. Livekit называет это **inter-node forwarding**, Jitsi - **Octo** (Olga's Cascading Topology for Oceans).
Jitsi Octo обеспечивает конференции до 100,000 участников (webinars). Реальный пример: UN General Assembly трансляции используют Jitsi с Octo cascading - несколько SFU нод в разных регионах, каждая держит группу слушателей.
При cascading SFU с 1000 участниками - сколько медиапотоков SFU-A форвардирует на SFU-B?
Global Distribution
Глобально распределённая WebRTC инфраструктура размещает SFU ноды в разных регионах - клиент подключается к ближайшей. Это снижает RTT: участник из Токио не делает round trip до дата-центра в Вирджинии для каждого медиапакета. SFU в Токио держит его соединение, а межрегиональный trunk доставляет его медиа в другие регионы.
Livekit Cloud строит глобальную сеть на 20+ PoP (Points of Presence): клиент подключается к ближайшему по WebRTC, ноды связаны через выделенные backbone каналы. При трансконтинентальном звонке Москва-Нью-Йорк: Москва -> SFU-EU -> backbone -> SFU-US -> Нью-Йорк. RTT медиа: ~30ms (Москва-EU) + ~60ms (EU-US) + ~20ms (US-NY) = ~110ms. Без PoP - ~180ms.
Cloudflare Calls строится на Workers и Cloudflare's global anycast network - 300+ PoP. Медиа входит в ближайший edge, дальше идёт по Cloudflare backbone. Это позволяет предложить WebRTC SFU без управления собственной медиаинфраструктурой.
Зачем размещать SFU в разных регионах, если backbone между регионами всё равно добавляет задержку?
Geo Routing
**Geo routing** определяет, к какому SFU подключится клиент. Варианты: DNS-based (GeoDNS возвращает IP ближайшего SFU по IP клиента), HTTP redirect (signaling сервер измеряет RTT до нескольких SFU и направляет на лучший), BGP Anycast (один IP, маршрутизация на уровне сети).
GeoDNS - самый простой, но IP-to-region mapping неточен (~15% ошибок для мобильных). Метод с замером RTT точнее: клиент делает HTTP HEAD к 3-4 региональным endpoint'ам, выбирается тот, от которого пришёл самый быстрый ответ. Так работает Twilio TURN server selection - клиент сам выбирает ближайший relay.
Daily.co публикует: geo routing через latency measurement снижает медиану RTT на 35% по сравнению с GeoDNS для мобильных пользователей. Особенно критично в Азии, где IP-to-region mapping особенно неточен для carrier NAT сетей.
Почему latency-based routing точнее GeoDNS для выбора SFU?
WebRTC Инфраструктура
Полная WebRTC инфраструктура включает несколько компонентов помимо SFU: **TURN серверы** для прохода через строгие NAT и корпоративные файрволы (до 15% соединений требуют TURN), **STUN серверы** для определения публичного IP, **Signaling сервер** для обмена SDP offer/answer и ICE candidates.
TURN трафик - самый дорогой: весь медиапоток идёт через relay сервер. При 15% penetration и средней meeting 30 минут 720p (1.5 Mbps) - это значительные расходы. Twillio и Daily оценивают TURN в 20-30% от общих infrastructure costs. Поэтому TURN серверы размещают рядом с SFU нодами чтобы минимизировать лишние hop'ы.
- **STUN** - определение публичного IP/port (бесплатно, UDP 3478)
- **TURN** - relay сервер для строгого NAT (дорого, весь трафик через него)
- **SFU** - медиасервер, форвардирует RTP между участниками
- **Signaling** - WebSocket/HTTP сервер для SDP и ICE exchange
- **Recording** - pipeline для захвата потоков (опционально)
Livekit Cloud берёт $0.001 за минуту участника - это покрывает SFU + TURN + signaling + STUN. При 1M минут/месяц = $1000. Самостоятельная инфраструктура на той же нагрузке: EC2 + Coturn + сеть = $600-800, но требует DevOps команды.
Масштабировать WebRTC = добавить больше SFU нод
Масштабирование WebRTC - система из нескольких компонентов: cascading SFU + geo routing + региональные TURN + signaling с sticky sessions
Добавление SFU без cascading приводит к тому что участники на разных SFU не видят друг друга. Без geo routing - клиенты подключаются к далёкому SFU. Без регионального TURN - relay трафик делает лишние hop'ы через континенты.
TURN сервер составляет 20-30% infrastructure cost при том что нужен только 15% соединений. Почему его нельзя убрать?
Итоги
- **Cascading SFU** связывает несколько нод server-to-server, форвардируя только активных спикеров - линейное масштабирование без N^2 роста трафика
- **Global distribution** - региональные SFU рядом с клиентами снижают RTT: клиент в Токио видит 18ms до ближайшего SFU вместо 170ms до Virginia
- **Geo routing** через latency measurement точнее GeoDNS на 35% для мобильных; TURN серверы - дорогой (20-30% costs) но необходимый компонент для 15% соединений
Связанные темы
Масштабирование WebRTC опирается на базовые принципы распределённых систем:
- Adaptive Bitrate — SVC снижает количество inter-SFU потоков в 3x - напрямую влияет на cascading эффективность
- CDN и Edge — Cloudflare Calls строится на CDN edge nodes - WebRTC как частный случай edge computing
- Load Balancing — Geo routing - специализированный load balancer с учётом latency, а не только CPU/memory
Вопросы для размышления
- При cascading SFU с 3 нодами по 500 участников и одним активным спикером - сколько дополнительных RTP потоков создаёт cascading? Как это меняется при 5 активных спикерах?
- Livekit использует latency measurement для geo routing, Cloudflare - anycast. В каких сценариях anycast менее эффективен, чем явный latency test?
- TURN сервер стоит дорого при 15% использовании. Как построить TURN capacity planning: какая ёмкость нужна при 10K одновременных участников с известным p15 penetration?