Cómo conectar usuarios de diferentes regiones: llamadas que se mantienen cerca de todos

Una videollamada que funciona bien en las pruebas puede comportarse de otra manera cuando tus usuarios están repartidos por el mundo. Dos personas en Singapur se pisan al hablar, una llamada en grupo con alguien en Canadá se congela solo para esa persona, y una transmisión en directo se queda cargando para los espectadores del otro lado de un océano. El código es el mismo para todos. Lo que cambia es la distancia entre cada persona y el servidor por el que pasa la llamada.
Este artículo explica por qué la distancia importa en una llamada, qué hace falta para que cada persona tenga un servidor cerca, en llamadas entre dos personas, llamadas en grupo y transmisiones en directo, y qué puede quedarse en un solo lugar.
Por qué la distancia importa en una llamada
En una fibra óptica, la luz recorre unos 200 kilómetros por milisegundo, y las rutas reales son más largas que una línea recta. Un paquete de Singapur a Fráncfort y vuelta tarda unos 160 milisegundos, y de Sídney a Fráncfort y vuelta, unos 280.
La conversación es sensible a eso. Cuando lo que alguien dice tarda más de unos 150 milisegundos en llegar al oído del otro, la gente empieza a pisarse al hablar y a esperar respuestas que ya están en camino. La codificación, la red y el búfer de jitter de cada dispositivo añaden su parte antes de que la distancia sume nada.
Una llamada que pasa por un servidor recorre dos tramos: de la primera persona al servidor, y luego del servidor a la segunda. Si el servidor está en Fráncfort, dos personas en Singapur envían cada una todo a Europa y de vuelta, así que lo que dicen llega bastante después de ese límite cómodo, aunque vivan en la misma ciudad. Si el servidor está en Singapur, la misma llamada tarda unos pocos milisegundos.
Así que la pregunta para cualquier app con usuarios en más de una región es por qué servidor pasa cada llamada y lo cerca que está de las personas que participan en ella.
Llamadas entre dos personas
Una llamada entre dos personas va directamente entre sus dispositivos cuando puede, sin ningún servidor en medio. Entonces el único retardo es la distancia entre ellas, y nada la acorta.
Cuando un cortafuegos bloquea el camino directo, la llamada pasa por un relé TURN (servidores STUN y TURN explica por qué). Con un solo relé en una sola región, todas las llamadas que necesitan relé van allí, así que dos personas en Asia cuyas redes necesitan un relé hablan a través de Europa.
La solución es un relé en cada región donde están tus usuarios, y que cada dispositivo use el más cercano:
- Un solo nombre, resuelto según la región. El nombre del relé lleva a cada dispositivo a la región más cercana, por latencia o según el lugar del que llega la petición. El dispositivo no necesita ninguna configuración, y una región nueva atiende a sus usuarios en cuanto sus relés responden a ese nombre.
- Credenciales que aceptan todas las regiones. Las credenciales de los relés suelen crearse en tu servidor a partir de un secreto que comparte con los relés. Todas las regiones las comprueban de la misma forma, así que un dispositivo puede usar cualquier relé al que llegue.
- Los puertos de la web en todas las regiones. El puerto 3478 por UDP para la mayoría de las redes, y el 443 con TLS para las redes que solo permiten tráfico web, con un certificado para cada nombre.
Con un relé cerca de cada dispositivo, una llamada a través de un relé tarda casi lo mismo que una directa, sean cuales sean los dos países que une.
Llamadas en grupo: un servidor multimedia, o uno por región
Una llamada en grupo funciona sobre un servidor multimedia: cada persona le envía su voz y su imagen una vez, y él las reenvía a todos los demás, con la calidad que muestra cada pantalla (cómo funcionan las videollamadas en grupo lo explica). La forma sencilla de gestionarlo es un servidor por llamada: la llamada se abre en un servidor, en la región de quien entró primero, y todos se unen a ese servidor.
Eso funciona mientras todos los de la llamada están en la misma parte del mundo. Con personas en dos continentes, alguien queda lejos del servidor, y cada voz e imagen que envía y recibe da el rodeo largo.
La solución es repartir una misma llamada entre servidores de varias regiones:
- Cada persona se une a un servidor de su propia región, el más cercano, y le envía su voz y su imagen una vez.
- Los servidores se pasan cada pista entre ellos. Una imagen cruza de una región a otra una vez por cada servidor que la necesita, no una vez por cada persona que la ve, y llega a todos desde el servidor de su propia región.
- Solo viaja lo que se ve. Una pista que nadie ve en una región no cruza hasta ella, y cada región recibe solo la calidad con la que la muestra su gente.
- Los servidores mantienen una sola llamada. Quién está en ella, quién habla, quién comparte pantalla y cuándo termina es lo mismo en todos los servidores, así que quienes participan ven una sola llamada, no varias unidas entre sí.
- Enlaces entre regiones que aguantan. Las pistas entre regiones viajan por enlaces privados o túneles cifrados, y los paquetes perdidos se vuelven a pedir a través de ellos, así que un enlace entre continentes no se convierte en imágenes congeladas.
Así, dos personas en Varsovia y dos en Montreal hablan cada una a través de un servidor cercano, y solo una copia de cada pista cruza el Atlántico.
Transmisiones en directo
Una transmisión en directo es el mismo problema con un emisor y muchos receptores. Quien emite envía la imagen a un servidor cercano, y cada espectador la ve desde un servidor de su propia región, que recibe la transmisión una vez del servidor de quien emite y la sirve a todos los que la ven allí. Así, un público repartido por muchos países la recibe cerca de cada espectador, y ningún espectador depende de un servidor al otro lado del mundo.
Lo que puede quedarse en una sola región
No todo necesita estar cerca. Los mensajes de chat, la presencia, los indicadores de escritura y los demás eventos de una app son pequeños, y un mensaje que llega 100 milisegundos más tarde de lo que podría pasa desapercibido. Mantenerlos en una sola región hace que su orden y su historial sigan siendo sencillos, y eso importa más que los milisegundos.
Así que el reparto habitual es el audio y el vídeo cerca de cada persona, y los eventos en un solo lugar.
Cómo conectar usuarios de diferentes regiones: una lista de comprobación
- Mira dónde están tus usuarios. Los países desde los que llaman te dicen qué regiones necesitas primero.
- Pon relés en cada una de esas regiones, tras un solo nombre resuelto según la región, con credenciales que acepten todas las regiones, en el puerto 443 además del 3478.
- Reparte cada llamada en grupo y cada transmisión en directo entre regiones, con cada persona en un servidor cercano y cada pista cruzando de una región a otra una sola vez, y solo mientras alguien la ve.
- Mantén las llamadas mientras cambian los servidores. Un servidor que se retira por mantenimiento pasa antes sus llamadas a otro, para que no se corte ninguna.
- Mantén los eventos en una sola región, salvo que tu app tenga un motivo para no hacerlo.
Ninguna de estas tareas es pequeña: cada región son servidores que hay que mantener en marcha, actualizar, vigilar y hacer crecer, y los enlaces entre ellas son una red en sí mismos.
Cómo conecta WordPlus Cloud a tus usuarios
WordPlus Cloud lo gestiona todo, así que tu app nunca tiene que elegir una región:
- Nuestros relés y servidores multimedia para llamadas funcionan en Alemania, Francia, el Reino Unido, Polonia, Canadá y Singapur, y los siguientes serán Estados Unidos, Australia, India e Italia. Cómo conectamos a tus usuarios los muestra en un mapa.
- Cada dispositivo llega a la región más cercana, mediante un solo nombre resuelto por latencia. Una llamada entre dos personas va directamente entre los dispositivos cuando puede, a través del relé más cercano a cada persona cuando un cortafuegos lo impide, y a través de nuestros servidores multimedia cuando ni siquiera los relés llegan, sin colgar.
- Cada persona de una llamada en grupo o de una transmisión en directo se une a un servidor multimedia de su propia región, y nuestros servidores se pasan cada pista entre regiones por enlaces privados, una vez por cada servidor que la necesita, y solo mientras alguien allí la ve.
- Un servidor que se retira por mantenimiento pasa antes sus llamadas a otro, y quienes están en ellas siguen hablando.
- Los mensajes y los eventos pasan por nuestros servidores de tiempo real en Alemania, que crecen con el tráfico. Llegarán servidores edge en más regiones para acercar también los eventos a tus usuarios.
Las llamadas entre dos personas están cifradas de extremo a extremo en todos los caminos, y tu servidor sigue decidiendo quién puede llamar a quién. Funciona igual en Better Messages en WordPress y en tus propias apps, desde Next.js, Laravel, Django y otros stacks con nuestros SDK. Videollamadas y llamadas en grupo para tu app muestra lo que te dan los SDK.