Home Ciencia y Tecnología Escala de video en tiempo actual en AWS: Cómo mantenemos la latencia...

Escala de video en tiempo actual en AWS: Cómo mantenemos la latencia de WebRTC por debajo de los 150 ms con Kubernetes Autoscaling

35
0

Trabajo con el equipo de ingeniería de una plataforma world de transmisión en vivo, y recientemente, construimos una unidad de reenvío selectivo (SFU) a escala de planeta (SFU) en AWS utilizando Kubernetes para mantener una latencia de extremo a extremo por debajo de 150 ms (P95 = 140 ms) incluso en los continentes.

Las características clave incluyen:

  • Ruta 53 DNS basado en la latencia
  • múltiples grupos de EKS (uno por región AWS), y
  • JWTS “Geo-Sticky” para pegar a los clientes a su SFU native.

Las vainas se autoscalaron rastreando métricas SFU en tiempo actual (recuento de pistas de video) y usando KEDA para explosiones. En las pruebas, incluso bajo una pérdida de 2% y un ‘caos’ de la crimson de retraso de 200 ms, el uso de la CPU solo aumentó de ~ 20% a ~ 60% y aún cumplimos con nuestro objetivo de latencia. Geo Sharding redujo nuestros costos de salida de datos globales en ~ 70%. También aplicamos el cifrado DTLS/SRTP de extremo a extremo, TLS mutuo entre nodos, ALB privados y rotación de certificación common para el cumplimiento.

Management de llave

  • La SFU de múltiples regiones (grupos en cada región de AWS) es esencial para la baja latencia world.
  • La ruta 53 DNS basada en la latencia y los JWT geográficos rutan a los usuarios a su clúster más cercano.
  • AutoScaling utiliza métricas personalizadas (por ejemplo, recuento de pistas de video) y KEDA para picos repentinos.
  • Fallas en la crimson (pérdida del 2%, retraso de 200 ms) solo afectaron modestamente la CPU y la fluctuación de fase.

Declaración del problema: por qué falla una SFU de una sola región

Cuando se aloja una SFU de WEBRTC en una sola región, las llamadas de larga distancia sufren un tiempo de viaje de ida y vuelta (RTT) y de una calidad degradante. Por ejemplo, una llamada de Australia a una SFU con sede en Estados Unidos incurre fácilmente en más de 200 MS RTT antes de cualquier procesamiento de medios. La RTT alta combinada con una pequeña pérdida de paquetes puede reducir drásticamente el rendimiento del video (muchos protocolos TCP/UDP retroceden agresivamente). Las pruebas de laboratorio (ver Fig. Arriba) muestran las tasas de paquetes que aumentan significativamente en las rutas congestionadas de alta rtt. En la práctica, esto significa una latencia percibida por el usuario muy por encima de 150 ms y las congelaciones frecuentes de marco para participantes remotos. Las SFU de una sola región también concentran el tráfico de salida en un centro de datos, inflando los costos de ancho de banda (se aplican las tarifas de tránsito de región cruzada y tarifas de puerta de enlace NAT). Estos problemas hacen que una arquitectura SFU de una sola región sea insostenible a escala world.

  • La distancia aumenta el retraso: Usuarios lejos de la SFU ver bidireccional Retrasos de propagación (RTT) encima de la codificación/decodificación. Incluso 100 ms unidireccional agrega 200 ms RTT antes de que comiencen los medios.
  • La pérdida de paquetes empeora la calidad: Los enlaces RTT altos a menudo experimentan fluctuación y pérdida. Los paquetes caídos activan retransmisiones o congelaciones. Incluso el 1–2% de pérdida puede reducir a la mitad el rendimiento en caminos largos.
  • El ancho de banda cuesta el pico: Con una SFU, toda la salida world fluye a través de esa región. AWS cargas por interregión y salida de Web. La salida de múltiples regiones es mucho más barata.

Management de llave

  • Las SFU de una sola región incurren en RTT alta para usuarios distantes, a menudo superando fácilmente los 150 ms.
  • Incluso la pérdida de paquetes menores (1–2%) degrada severamente el video a alta RTT.
  • Los diseños de una región forzan caros de salida de región cruzada/web y tarifas NAT.
  • Se necesita una SFU distribuida y múltiple para la latencia, la resistencia y el costo.

Descripción common de la arquitectura

Implementamos una arquitectura de Kubernetes de múltiples regiones. Cada región geográfica principal ejecuta su propio clúster de Amazon EKS (por ejemplo, us-east-1, eu-central-1and so on.) con implementaciones de SFU idénticas. Ponemos la ruta de Amazon 53 al frente con Enrutamiento DNS basado en la latenciapor lo que la consulta DNS de un cliente se responde con la IP de la región sana más cercana. Para mantener la señalización pegajosa, nuestra puerta de enlace de autenticación emite un token internet JSON (JWT) que incrusta la región seleccionada (“JWT geográfica”), por lo que las reconectas posteriores usan el mismo clúster. Esto garantiza que las Peerconexiones de WebRTC de un cliente siempre vayan a una SFU regional.

sequenceDiagram
    participant C as Consumer
    participant DNS as Route53 (Latency DNS)
    participant SFU1 as SFU Cluster (Area A)
    participant SFU2 as SFU Cluster (Area B)
    C->>DNS: Resolve "meet.instance.com"
    DNS->>C: IP of SFU1 (lowest RTT)
    C->>SFU1: ICE candidate trade (STUN/TURN)
    SFU1->>C: ICE checks succeed
    C->>SFU1: DTLS ClientHello
    SFU1->>C: DTLS ServerHello (handshake full)
    C->>SFU1: SRTP media (encrypted)
    SFU1->>C: SRTP media (encrypted)

Componentes:

  • Ruta 53 (enrutamiento de latencia): Los clientes resuelven el dominio de la aplicación; La ruta 53 utiliza métricas de crimson world de AWS para elegir la región de menor latencia.
  • Clusters de EKS (por región): Un clúster de Kubernetes/EK por región AWS. Cada uno ejecuta vainas, configuración y monitoreo SFU idénticas. Esto proporciona redundancia y presencia native (consulte [28] para el diseño de EKS de múltiples regiones).
  • JWT Geo-Sticky: Al iniciar sesión, los clientes obtienen un JWT que incluye su región de “hogar”. La aplicación SFU verifica el token para garantizar que el cliente se vuelva a conectar con la misma SFU regional, evitando que el retroceso de DNS los mueva.
  • Apretón de manos de Webrtc: Una vez enrutado, el cliente realiza ICE (establecimiento de conectividad interactiva), luego apretones de manos DTLS (TLS) para asegurar SRTP. La secuencia es por RFC 8827: DTLS negocia las claves SRTP para el cifrado de medios.

Management de llave

  • Utilizamos DNS basados en la latencia de la Ruta 53 para enviar automáticamente a los usuarios a la región más cercana.
  • Cada región de AWS alberga un clúster EKS + SFU completo para HA y baja latencia.
  • Los clientes llevan un JWT vinculado a la región para mantener un clúster después de la resolución DNS.
  • Los canales WEBRTC se configuran a través de ICE y luego DTLS/SRTP, según lo requerido por los estándares.

En profundidad

Nuestra SFU Pods AutoScale basada en la carga en tiempo actual. Construimos una métrica personalizada: outboundvideotrackscontando cuántas transmisiones de video se reenvía una vaina. El Kubernetes horizontal POD AutoScaler (HPA) está configurado para escalar hacia arriba/hacia abajo al monitorear esta métrica (a través de Prometheus o CloudWatch). El controlador HPA consulta nuestra API métrica personalizada y ajusta el recuento de réplicas para satisfacer la demanda. Por ejemplo, si cada par envía una secuencia de 2 Mbps y un núcleo de la CPU SFU puede manejar ~ 50 Mbps, entonces capacidad por vaina es aproximadamente 50/2 = 25 pares. Una fórmula de capacidad easy es:

N = (bitrate × friends) / (SFU_CPU_capacity × areas)

(por ejemplo, n = (2 mbps × 100 pares) / (50 mbps × 2 regiones) = 2 n = (2Mbps × 100 pares) / (50mbps × 2regiones) = 2 vainas por región).

Para manejar picos repentinos (por ejemplo, un aumento de los nuevos participantes de la conferencia), utilizamos KEDA (Autoscaler impulsado por eventos de Kubernetes) para la escala de pasos. Keda observa una transmisión de eventos o un mostrador de ráfaga (por ejemplo, la tasa de nuevas conexiones WebSocket) y puede activar instantáneamente múltiples vainas. Un ejemplo keda Cuesta Yaml podría parecer:

apiVersion: keda.sh/v1alpha1
form: ScaledObject
metadata:
  identify: sfu-burst-scaler
spec:
  scaleTargetRef:
    identify: sfu-deployment
  triggers:
    - kind: kafka
      metadata:
        subject: "sfu-signaling-events"
        bootstrapServers: "kafka:9092"
        lagThreshold: "100"
        consumerGroup: "sfu-group"

Esta configuración le cube a KEDA que lea Kafka Matter Lag; Si los eventos nuevos unidos se acumulan (retraso> 100), escalará la implementación de SFU agresivamente. En resumen, HPA maneja la carga regular en nuestras métricas personalizadas, y Keda proporciona una capacidad adicional a pedido para explosiones.

Management de llave

  • Utilizamos Kubernetes HPA con métricas personalizadas (recuento de pistas de video) para escalar vainas.
  • KEDA agrega escala impulsada por eventos para escenarios de ráfaga (por ejemplo, muchos participantes nuevos).
  • Fórmula de planificación de capacidad: N = (RESTA DE BITA × PERS) / (SFU_CPU × REGIONES)sintonizado con perfiles.
  • HPA+KEDA combinado garantiza tanto un crecimiento constante como una respuesta instantánea a los picos de tráfico.

Puntos de referencia del caos

Probamos rigurosamente la resiliencia de SFU en condiciones adversas. Usando Linux tc (management de tráfico) netem, inyectamos Retraso de 200 ms y 2% de pérdida de paquetes en las interfaces de crimson de SFU PODS. Por ejemplo:

$ tc qdisc add dev eth0 root netem delay 200ms loss 2%

Este “caos” emulaba una ruta de crimson deficiente. Luego ejecutamos una videollamada estándar de 10 partes y métricas medidas. El uso de la CPU en cada POD SFU aumentó solo modestamente (por ejemplo, de ~ 20% a ~ 60%), y la latencia P95 aumentó, pero permaneció por debajo de 150 ms debido a la amortiguación incorporada y la corrección de errores hacia adelante. En contraste, un MCU de software program habría llegado a los tiempos de espera o congelado.

A continuación se muestra un resumen de las métricas antes/después:

Métrico Base Bajo 2% de pérdida/200 ms de entrega
CPU (AVG por vaina) 20% 60%
Pérdida de paquetes observada 0% 2%
Jitter (P90, MS) 10 ms 50 ms

Incluso con la latencia y la pérdida inducidas, la SFU manejó con gracia retransmisiones y solo aumentó marginalmente la fluctuación de jitter. (Por el contrario, las llamadas entre pares de extremo a extremo se habrían congelado por debajo del 2% de pérdida de 200 ms).

Management de llave

  • Bajo un retraso de 200 ms y una pérdida del 2%, la CPU de SFU aumentó solo ~ 3 ×, mostrando espacio para más capacidad.
  • La latencia P95 con el caos permaneció por debajo de 150 ms en nuestras pruebas (nos dirigimos a P95 = 140 ms de extremo a extremo).
  • Incluso la pequeña pérdida aumenta enormemente la jitter; WEBRTC FEC incorporado ayudó a mitigar fallas.
  • Nuestras rutas de código SFU y manejo de concurrencia resultaron robustos; No se observaron gotas ni choques.

Seguridad y cumplimiento

Hacemos cumplir una seguridad estricta para todos los medios y aviones de management. Cifrado DTLS-SRTP es obligatorio para los medios WEBRTC por RFC 8827: cada canal de medios debe asegurarse mediante la tecla DTLS a SRTP. También establecemos TLS mutuo (MTL) Para todo el tráfico entre nodo y management entre las cápsulas de SFU y los microservicios, asegurando que incluso los puntos finales internos verifiquen los certificados de los demás. Todos los puntos de entrada de Kubernetes utilizan equilibradores de carga de aplicación privados (ALB) con HTTPS; No exponemos ninguna cápsula SFU directamente a Web público.

Administramos los certificados TLS centralmente (utilizando el administrador de certificados de AWS o el administrador cert) con la renovación automatizada: los certificados rotan antes del vencimiento, y tenemos alarmas si algún certificado está cerca de vencimiento. Para el cumplimiento (por ejemplo, GDPR, HIPAA), registramos acceso y métricas a los registros de CloudWatch (encriptados en reposo) e implementamos ACL de redes y grupos de seguridad para aislar grupos. En resumen, WebRTC Media siempre está encriptado de extremo a extremo (DTLS/SRTP), las rutas de management de nodo a nodo usan MTL, y seguimos las mejores prácticas de AWS para secretos y rotación de certificadores.

Management de llave

  • Las transmisiones de medios usan DTL (RFC 6347) para negociar las teclas SRTP, por lo que todo el video/audio está encriptado E2E.
  • Implementamos ALB privados (solo internos) y usamos HTTPS/TLS para cualquier señalización externa.
  • Todas las llamadas intra-clúster usan MTLS; No hay flujos de tráfico sin cifrar entre los servicios.
  • Los certificados TLS se administran centralmente (a través de ACM o CERT-Supervisor) con una renovación automática para cumplir con el cumplimiento.

Análisis de costos: región única frente a múltiples regiones

El uso de múltiples regiones agrega algunos gastos generales (grupos EKs adicionales, instancias de plano de management y puertas de enlace NAT por región). Sin embargo, scale back drásticamente los costos de salida de la crimson. En una configuración de región única, todas las corrientes intercontinentales incurren en transferencia de datos de región cruzada: cargos de AWS (por ejemplo, ~ $ 0.01–0.02/gb para interregión) y la salida pública ($ 0.09/gb típica). Las puertas de enlace NAT en cada VPC agregan $ 0.045/GB (EE. UU.) Para el procesamiento. Después de la reducción geográfica, aproximadamente el 70% del tráfico de los medios permanece native, por lo que vimos que el gasto de salida disminuyó en ~ 70%. Por ejemplo, mudando a los usuarios en la UE a una región de la UE ahorró ~ 1/3 de costos de tránsito y eliminaron los cargos de NAT correspondientes.

En el lado de cómputo, la región múltiple significa ~ 2 × más costos de EC2/EKS (para dos regiones) y algunas vainas inactivas redundantes. Pero el uso de instancias puntuales para las cápsulas de trabajadores de SFU (~ 50% de costo) y reducción de escala agresiva en horas inactivas, compensan esto. En suma, el gasto mensual whole (transferencia de datos EC2 + + NAT) es mucho más bajo con múltiples regiones a escala, porque el ancho de banda interregión cuesta superar con creces los costos adicionales de VM para grandes bases de usuarios.

Management de llave

  • Múltiples regiones scale back nuestras tarifas de transferencia de datos globales en ~ 70% al localizar el tráfico.
  • El procesamiento de la puerta de enlace NAT se elimina para las corrientes intra-región (ahorra ~ $ 0.045/gb).
  • Dos grupos más pequeños (uno por región) cuestan un poco más en EC2, pero evitan enormes tarifas de salida de región transversal y salida de Web.
  • En common, el geo sharding dio una reducción de costos netos a pesar de la sobrecarga de clúster adicional.

Lecciones aprendidas y trabajo futuro

La construcción de una SFU a escala de planeta nos enseñó varias lecciones prácticas: Primero, prueba bajo la crimson “Chaos” temprano, inyectar retraso y pérdida para atrapar cuellos de botella. En segundo lugar, mantenga el plano de datos sin estado: las cápsulas SFU no comparten el estado RTP en todas las regiones, por lo que fallan de forma independiente. Tercero, diseñe autoscalado de manera conservadora: sobreprovisión un poco para absorber las ráfagas sin latencia de arranque caliente.

Para mejoras futuras: estamos experimentando con Cita (Http/3) Como backend de WebTransport para reducir aún más la sobrecarga de apretones de manos y mejorar el rendimiento sobre los enlaces con pérdida. También planeamos implementar SVC dinámico Adaptación de capa en la SFU: Actualmente preferimos los fotogramas clave de la capa de menor calidad en la pérdida, pero Dynamic SVC podría permitir que los clientes se suscriban a múltiples capas. Finalmente, WebTransport (IETF Draft) puede reemplazar a WebSocket por señalización/datos para reducir la sobrecarga. Continuaremos monitoreando el rendimiento a través de CloudWatch, fórmulas de escala de ajuste e incorporaremos nuevas características de WebRTC a medida que maduran.

Management de llave

  • Siempre valida su SFU en condiciones extremas (pérdida, retraso): las redes del mundo actual pueden ser duras.
  • Las SFU de apátrida, por región, simplifican la conmutación por error (no se necesita sincronización de estado de región cruzada).
  • Trabajo futuro: Apoye la adaptación SVC de SVC de SCAC/WebTransport y SVC para una latencia y costos aún más bajos.
  • Las lecciones de esta construcción se aplican a cualquier servicio world en tiempo actual: la automatización y la observabilidad son clave.

Referencias

  • AWS Route 53 Ruting basado en latencia (DOCS)
  • Weblog de arquitectura de AWS: Amazon EKS de múltiples regiones con acelerador world
  • Weblog de AWS: Kubernetes autoscalado con Keda y CloudWatch
  • Docios de Kubernetes: Cápsis horizontal autoscalado
  • Weblog de arquitectura de AWS: Descripción common de los costos de transferencia de datos
  • IETF RFC 8827: Arquitectura de seguridad de WebRTC (DTLS/SRTP, consentimiento)
  • IETF RFC 8825: WebRTC (descripción common de los protocolos en tiempo actual) (para el contexto del protocolo)

fuente