
Масштабирование видео в реальном времени на AWS: как мы поддерживаем задержку WEBRTC ниже 150 мс с AutoScaling Kubernetes
18 июля 2025 г.Я работаю с инженерной командой глобальной платформы в прямом эфире, и недавно мы построили подразделение селективного пересылки WEBRTC в планете (SFU) на AWS, используя Kubernetes, чтобы сохранить сквозную задержку ниже 150 мс (P95 = 140 мс) даже на континентах.
Ключевые функции включают:
- Маршрут 53 DNS на основе задержки
- несколько кластеров EKS (один на область AWS) и
- «Geo-Shicky» JWTS придерживаться клиентов в их местный SFU.
Стручки были автоматическими, отслеживая метрики SFU в режиме реального времени (количество видео-треков) и используя KEDA для взрывов. При тестировании, даже при 2% потери и 200 мс задержки сети «хаос», использование ЦП только выросло с ~ 20% до ~ 60%, и мы все еще достигли нашей цели задержки. Гео-сборы сократила наши глобальные выходные затраты на данные на ~ 70%. Мы также обеспечиваем соблюдение сквозного шифрования DTLS/SRTP, взаимных TLS между узлами, частными ALB и регулярным вращением сертификации для соответствия.
Ключевые выводы
- Мультирегион SFU (кластеры в каждом регионе AWS) необходим для низкой глобальной задержки.
- Маршрут 53 DNS на основе задержек и Geo-Spicky JWTS Route пользователей до их ближайшего кластера.
- AutoScaling использует пользовательские метрики (например, количество видео -треков) и Keda для внезапных шипов.
- Сбои в сети (потеря 2%, задержка 200 мс) только скромно повлияло на ЦП и джиттер.
Заявление о проблеме: почему сбое с одним регионом SFU
Когда в одном регионе размещается только в одном регионе. Например, вызов из Австралии в американский SFU легко взимает 200+MS RTT перед какой-либо обработкой медиа. Высокий RTT в сочетании с даже небольшими потерями пакетов может резко снизить пропускную способность видео (многие протоколы TCP/UDP агрессивно возвращаются). Лабораторные тесты (см. Рис. Выше) показывают, что скорости каплей пакетов значительно растут по перегруженным, высоким RTT-пути. На практике это означает, что задержка, занимающаяся пользователем, значительно выше 150 мс и частые замораживание кадров для удаленных участников. Однорегион SFU также концентрирует выходной трафик в один центр обработки данных, накапливая затраты на пропускную способность (применяются платы за транзит по перекрестному региону и шлюз NAT). Эти проблемы делают однорегионную архитектуру SFU неустойчивой в глобальном масштабе.
- Расстояние увеличивает задержку:Пользователи далеко от SFU видятдвустороннийЗадержки распространения (RTT) поверх кодирования/декодирования. Даже 100 мс односторонние добавляет 200 мс RTT перед началом мультимедиа.
- Потеря пакета ухудшает качество:Высокие ссылки RTT часто испытывают джиттер и потерю. Упавшие пакеты запускают ретрансмиссии или замораживание. Даже 1–2% потеря может сократить пропускную способность на длинных путях.
- Пропускная способность стоит Spike:С помощью одного SFU все глобальные выходцы протекают через этот регион. AWS взимает плату за переход и интернет. Многорегионный выход гораздо дешевле.
Ключевые выводы
- Однорегионный SFUS имеет высокий RTT для отдаленных пользователей, которые часто легко превышают 150 мс.
- Даже незначительная потеря пакетов (1–2%) сильно разрушает видео на высоком RTT.
- Однорегионные проекты заставляют дорогостоящие перекрестные/интернет-выходные и NAT.
- Распределенный многорегионный SFU необходим для задержки, устойчивости и стоимости.
Обзор архитектуры
Мы развернули мультирегионную архитектуру Kubernetes. Каждый крупный географический регион запускает свой собственный кластер Amazon EKS (например,us-east-1
Вeu-central-1
и т. д.) с одинаковыми развертываниями SFU. Мы поставили Amazon Route 53 впереди сМаршрутизация DNS на основе задержкиТаким образом, на запрос DNS клиента отвечает IP с помощью IP ближайшего здорового региона. Чтобы сохранить сигнализацию, наш шлюз аутентификации выпускает веб-токен JSON (JWT), который внедряет выбранную область («Geo-Shicky JWT»), поэтому последующие воссоединения используют один и тот же кластер. Это гарантирует, что переписки клиента всегда отправляются в один региональный SFU.
sequenceDiagram
participant C as Client
participant DNS as Route53 (Latency DNS)
participant SFU1 as SFU Cluster (Region A)
participant SFU2 as SFU Cluster (Region B)
C->>DNS: Resolve "meet.example.com"
DNS->>C: IP of SFU1 (lowest RTT)
C->>SFU1: ICE candidate exchange (STUN/TURN)
SFU1->>C: ICE checks succeed
C->>SFU1: DTLS ClientHello
SFU1->>C: DTLS ServerHello (handshake complete)
C->>SFU1: SRTP media (encrypted)
SFU1->>C: SRTP media (encrypted)
Компоненты:
- Маршрут 53 (маршрутизация задержки):Клиенты разрешают домен приложения; Route 53 использует глобальные сетевые метрики AWS для выбора региона с самой низкой задержкой.
- Кластеры EKS (для региона):Один кластер Kubernetes/EKS на область AWS. Каждый запускает идентичные стручки SFU, конфигурацию и мониторинг. Это обеспечивает избыточность и локальное присутствие (см.
- Geo-Speky JWT:После входа клиенты получают JWT, который включает в себя их «домашний» регион. Приложение SFU проверяет токен, чтобы убедиться, что клиент воссоединяется с тем же региональным SFU, предотвращая их перемещение DNS.
- Hebrtc Handshake:После маршрутизации клиент выполняет рукопожатия ICE (интерактивное учреждение подключения), а затем DTLS (Datagram TLS) для обеспечения SRTP. Последовательность - на RFC 8827: DTLS обсуждает клавиши SRTP для шифрования средств массовой информации.
Ключевые выводы
- Мы используем DNS на основе задержки Route 53 для автоматической отправки пользователей в ближайший регион.
- Каждый регион AWS размещает полный кластер EKS + SFU для HA и низкой задержки.
- Клиенты несут в регионе JWT, чтобы придерживаться одного кластера после разрешения DNS.
- Каналы WEBRTC устанавливаются через ICE, затем DTLS/SRTP, как того требует стандарты.
Автоматическая масштаба в глубине
Наши стручки SFU AutoScale на основе нагрузки в реальном времени. Мы создали пользовательскую метрику:outboundvideotracks, подсчитывая, сколько видеополиваний переправляет стручок. Horizontal Pod Autoscaler Kubernetes Autoscaler (HPA) настроен на масштаб вверх/вниз путем мониторинга этой метрики (через Prometheus или CloudWatch). Контроллер HPA запрашивает наш пользовательский метрический API и корректирует количество реплик, чтобы удовлетворить спрос. Например, если каждый сверстник отправляет поток 2 Мбит / с, а ядро ЦП SFU может обрабатывать ~ 50 Мбит / с, тогдаемкостьза стручок примерно 50/2 = 25 сверстников. Простая формула емкости:
N = (bitrate × peers) / (SFU_CPU_capacity × regions)
(например, n = (2 Мбит / с × 100 сверстников) / (50 Мбит / с × 2 области) = 2 n = (2 Мбит / с × 100 одноранговых) / (50 Мбит / с × 2Regions) = 2 стручка на область).
Чтобы справиться с внезапными шипами (например, всплеском новых участников конференции), мы используем KEDA (Kubernetes-управляемый Autoscaler) для масштабирования шага. KEDA смотрит поток событий или взрывной счетчик (например, скорость новых соединений WebSocket) и может мгновенно запустить несколько стручков. Пример кедыScaledObjectЯмл может выглядеть как:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: sfu-burst-scaler
spec:
scaleTargetRef:
name: sfu-deployment
triggers:
- type: kafka
metadata:
topic: "sfu-signaling-events"
bootstrapServers: "kafka:9092"
lagThreshold: "100"
consumerGroup: "sfu-group"
Эта конфигурация говорит KEDA прочитать задержку темы Kafka; Если события нового сустава накапливаются (лаг> 100), это будет масштабировать развертывание SFU агрессивно. Таким образом, нормальная нагрузка обрабатывается HPA на наших пользовательских метрик, а KEDA обеспечивает дополнительную емкость для всплесков.
Ключевые выводы
- Мы используем Kubernetes HPA с пользовательскими метриками (количество видео -треков) для масштабирования стручков.
- Keda добавляет масштабирование, управляемое событиями, для сценариев Bursty (например, многие новые участники).
- Формула планирования пропускной способности:N = (Bitrate × Peers) / (SFU_CPU × области), настроенный с профилированием.
- Комбинированный HPA+KEDA обеспечивает как устойчивый рост, так и мгновенный ответ на всплески трафика.
Хаос -тесты
Мы строго протестировали устойчивость SFU в неблагоприятных условиях. Используя Linuxtc
(управление трафиком) Netem, мы вводилиЗадержка 200 мси2% потеря пакетовна сетевых интерфейсах SFU Pods. Например:
$ tc qdisc add dev eth0 root netem delay 200ms loss 2%
Этот «хаос» подражал плохим сетевым пути. Затем мы запустили стандартный 10-сторонний видеозвонок и измерены метрики. Использование процессора на каждом стручке SFU поднималось лишь скромно (например, с ~ 20% до ~ 60%), а задержка P95 увеличилась, но осталась менее 150 мс из-за встроенной буферизации и коррекции ошибок вперед. Напротив, программный MCU получил бы тайм -ауты или заморожен.
Ниже приведено резюме до/после метрик:
Показатель | Базовый уровень | Убыточная потерь в 2%/200 мс. |
ЦП (AVG на капсул) | 20% | 60% |
Наблюдаемая потеря пакета | 0% | 2% |
Джиттер (P90, MS) | 10 мс | 50 мс |
Даже с индуцированной задержкой и потерей, SFU изящно обрабатывал повторные передачи и лишь незначительно увеличенные джиттер. (Напротив, сквозные вызовы сверстников заморозили бы за 2% потери на 200 мс.)
Ключевые выводы
- В течение 200 мс задержки и потери 2% процессор SFU вырос всего на ~ 3 ×, показывая место для большей мощности.
- Задержка P95 с хаосом оставалась менее 150 мс в наших тестах (мы нацелены на P95 = 140 мс сквозной).
- Даже небольшая потеря значительно увеличивает джиттер; Встроенный WEBRTC FEC помог смягчить глюки.
- Наши пути кода SFU и обработка параллелистики оказались надежными; Не наблюдалось капель или сбоев.
Безопасность и соответствие
Мы обеспечиваем строгую безопасность для всех медиа и плоскостей управления.DTLS-SRTP шифрованиеобязателен для WEBRTC Media Per RFC 8827: каждый медиа -канал должен быть закреплен с помощью DTLS -Keying для SRTP. Мы также устанавливаемвзаимные TLS (MTLS)Для всех меж узла и управления трафиком между стручками SFU и микросервисами гарантируют, что даже внутренние конечные точки проверяют сертификаты друг друга. Все точки входа в Kubernetes используют балансировщики нагрузки частного приложения (ALB) с HTTPS; Мы не выставляем какую -либо стручок SFU непосредственно в общедоступный интернет.
Мы управляем сертификатами TLS в центре (используя диспетчер сертификатов AWS или сертификат) с автоматическим обновлением: сертификаты вращаются до истечения срока действия, и у нас есть тревога, если какой-либо сертификат почти не истечет. Для соответствия (например, GDPR, HIPAA) мы входим в систему доступа и метрики в журналы CloudWatch (зашифрованные в состоянии покоя), и мы реализуем сетевые ACL и группы безопасности для выделения кластеров. Таким образом, WEBRTC Media всегда зашифрована зашифрованным (DTLS/SRTP), пути управления узлом к узлу используют MTLS, и мы следуем передовым методам AWS для секретов и ротации сертификации.
Ключевые выводы
- Медиа -потоки используют DTLS (RFC 6347) для переговоров клавиш SRTP, поэтому все видео/аудио зашифровано.
- Мы развертываем частные ALB (только внутренние) и используем HTTPS/TLS для любой внешней сигнализации.
- Все внутрикластерные вызовы используют MTLS; Нет незашифрованных транспортных потоков между услугами.
- Сертификаты TLS находятся в центре управления (через ACM или Cert-Manager) с автоматическим обновлением для соответствия соответствию.
Анализ затрат-однорегион против мультирегиона
Использование нескольких областей добавляет несколько накладных расходов (дополнительные кластеры EKS, экземпляры плоскости управления и шлюзы NAT на область). Тем не менее, это резко сокращает выходные расходы сети. В однорегионной настройке все межконтинентальные потоки несут передачу данных по перекрестной регионе: сборы AWS (например, ~ 0,01–0,02/ГБ для межрегиции) и публичный выход (0,09 долл. США/ГБ типично). NAT Шлюзы в каждом VPC добавляют 0,045 долл. США/ГБ (США) для обработки. После того, как гео-сбоя примерно 70% медиа-трафика остается локальным, поэтому мы увидели, как выходные расходы упали на ~ 70%. Например, перемещение пользователей в ЕС в регион ЕС сохранил ~ 1/3 транзитных затрат и исключило соответствующие заряды NAT.
На вычислительной стороне мультирегион означает ~ 2 × больше затрат EC2/EKS (для двух регионов) и некоторых избыточных простоя. Но использование точечных экземпляров для капсул SFU Worker (~ 50%) и агрессивного снижения в холостые часы сметает это. В целом, общие ежемесячные расходы (EC2 + передача данных + NAT)намного нижес многорегистрированной в масштабе, потому что затраты на межрегистрированную полосу пропускания намного перевешивают дополнительные затраты на виртуальную машину для крупных пользовательских баз.
Ключевые выводы
- Мультирегион сократил наши глобальные платы за передачу данных на ~ 70%, локализуя трафик.
- Обработка шлюза NAT устраняется для внутрирегионных потоков (экономит ~ 0,045 долл. США/ГБ).
- Два меньших кластера (по одному на регион) стоят немного дороже в EC2, но избегайте огромных перекрестных и интернет-выплат.
- В целом, Geo-Sharding дало чистое снижение затрат, несмотря на дополнительные кластерные накладные расходы.
Извлеченные уроки и будущая работа
Создание планеты SFU преподало нам нескольким практическим урокам: во-первых, тестирование под сетью «хаос» рано-задержка и потерю внесите задержку, чтобы поймать узкие места. Во -вторых, сохраняйте плоскость данных без сохранения состояния: стручки SFU не разделяют состояние RTP в разных регионах, поэтому они терпят неудачу независимо. В-третьих, конструкция консервативно: немного переоценки, чтобы поглощать всплески без задержки.
Для будущих улучшений: мы экспериментируем сQuic(Http/3) в качестве бэкэнда Webtransport для дальнейшего сокращения накладных расходов рукопожатия и повышения производительности по сравнению с Lisply Links. Мы также планируем реализоватьДинамический SVCАдаптация слоя на SFU: в настоящее время мы предпочитаем ключевые кадры от уровня с самым низким качеством при потере, но динамический SVC может позволить клиентам подписаться на несколько слоев. Наконец, WebTransport (Draft IETF) может заменить WebSocket для передачи сигналов/данных, чтобы уменьшить накладные расходы. Мы продолжим мониторинг производительности с помощью CloudWatch, формул масштабирования настройки и включить новые функции WEBRTC по мере их развития.
Ключевые выводы
- Всегда проверяйте свой SFU в экстремальных условиях (потеря, задержка)-реальные сети могут быть резкими.
- Безрезультатно, SFU SFU упрощают отказоустойчивость (не требуется синхронизация состояния перекрестного региона).
- Будущая работа: поддержка Quic/Webtransport и Smarter SVC адаптация для даже более низкой задержки и стоимости.
- Уроки из этой сборки применяются к любому глобальному обслуживанию в реальном времени: автоматизация и наблюдение являются ключевыми.
Ссылки
- Маршрут AWS Route 53 Маршрутизация на основе задержки (DOCS)
- Блог архитектуры AWS:Multi-Region Amazon EKS с глобальным акселератором
- Блог AWS:Автоскалирование Kubernetes с Keda и Cloudwatch
- Kubernetes Docs:Горизонтальный POD Autoscaling
- Блог архитектуры AWS:Обзор затрат на передачу данных
- IETF RFC 8827:WEBRTC Security Architecture(DTLS/SRTP, согласие)
- IETF RFC 8825:WEBRTC (обзор протоколов в реальном времени)(для контекста протокола)
Оригинал