WebSocket es un protocolo de red que proporciona un canal de comunicación full-duplex sobre una única conexión TCP. Crea una conexión persistente entre un cliente y un servidor, lo que permite a ambos enviar y recibir datos en cualquier momento. Esto evita la sobrecarga y la latencia de establecer conexiones nuevas de forma repetida, por lo que resulta más eficiente que el modelo tradicional de solicitud-respuesta HTTP. WebSocket se usa principalmente en aplicaciones que requieren comunicación en tiempo real. ALB admite el protocolo WebSocket de forma predeterminada.
Introducción a WebSocket
Por qué usar WebSocket
A medida que evolucionan las tecnologías web, las aplicaciones necesitan cada vez más que los servidores envíen datos en tiempo real para funciones como salas de chat en vivo y comentarios instantáneos. El método tradicional de sondeo (polling), donde el navegador del cliente envía solicitudes HTTP de manera repetida al servidor para obtener los datos más recientes, presenta desventajas importantes. Las solicitudes frecuentes con encabezados HTTP grandes y cargas útiles de datos pequeñas aumentan la carga del servidor y desperdician ancho de banda.
Para resolver estos problemas, HTML5 introdujo el protocolo WebSocket, que ofrece una solución más eficiente para la comunicación entre cliente y servidor. WebSocket admite comunicación full-duplex, es decir, el servidor y el cliente pueden enviar y recibir datos de forma simultánea. Esto permite que el servidor envíe datos nuevos al cliente de manera proactiva sin esperar una solicitud de sondeo. Este mecanismo de comunicación bidireccional y en tiempo real mejora la eficiencia de la transferencia de datos, reduce las solicitudes de red innecesarias y ahorra recursos del servidor y ancho de banda, lo que brinda una experiencia de usuario más fluida y receptiva.
Características principales de WebSocket
La comunicación comienza con un handshake TCP estándar de tres vías. Después, el cliente envía una solicitud HTTP especial conocida como handshake de actualización de protocolo. Una vez que este handshake se completa correctamente, la conexión cambia de HTTP a WebSocket. Toda la comunicación posterior entre el cliente y el servidor utiliza el protocolo WebSocket, lo que permite el intercambio bidireccional de datos sobre la misma conexión.
Cuando se establece una conexión WebSocket, esta permanece activa. Esta conexión persistente y de baja latencia permite una transferencia de datos continua y bidireccional, lo que mejora la eficiencia del intercambio de información.
WebSocket se comunica mediante tramas de datos que tienen su propio formato de protocolo de trama con encabezados concisos. Los datos se transmiten como texto o en formato binario. Este método reduce la sobrecarga del protocolo en las conexiones persistentes y hace que la interacción de red sea más eficiente. Además, ahorra recursos del servidor y ancho de banda, al tiempo que proporciona una experiencia interactiva en tiempo real más fluida.
Para obtener más información sobre el protocolo WebSocket, consulte la documentación oficial The WebSocket Protocol.
Casos de uso de WebSocket
WebSocket es ideal para aplicaciones que requieren comunicación bidireccional rápida y en tiempo real, como aplicaciones de IA, salas de chat en línea, sistemas de notificaciones en tiempo real, juegos multijugador en línea y fuentes de datos de mercado en tiempo real.
Escenario de ejemplo
Una empresa desea desplegar una aplicación de chat en línea basada en web en Alibaba Cloud. Los usuarios acceden al servicio de backend a través de un nombre de dominio para comunicarse en tiempo real. Al tratarse de una aplicación de mensajería instantánea, requiere baja latencia y una comunicación bidireccional eficiente y en tiempo real.
El servicio del sitio web de la empresa enfrenta desafíos de alta concurrencia y gestión de conexiones persistentes. A medida que crece el número de usuarios, el modelo HTTP tradicional no puede admitir muchos usuarios concurrentes en la comunicación en tiempo real, ya que cada interacción requiere una conexión nueva. Esto provoca un aumento drástico en la carga del servidor y un rendimiento deficiente.
En este escenario, el uso de ALB con el protocolo WebSocket gestiona de manera eficaz las conexiones persistentes bajo alta concurrencia. Desplegar la aplicación en un grupo de servidores y utilizar Redis para la sincronización de mensajes garantiza la alta disponibilidad. De este modo se obtiene una solución de mensajería en tiempo real confiable y eficiente para la aplicación de sala de chat en línea.
Notas de uso
Los listeners HTTP en una instancia de ALB admiten el protocolo WebSocket de forma predeterminada. ALB admite actualizaciones continuas (rolling updates), lo que significa que los cambios de configuración no interrumpen las conexiones persistentes existentes.
Tenga en cuenta lo siguiente:
Si la conexión entre una instancia de ALB y un servidor de backend utiliza una versión específica de HTTP, como HTTP/1.1, se recomienda que el servidor de backend también sea compatible con esa versión de HTTP.
-
El tiempo de espera predeterminado de la solicitud de conexión para un listener HTTP es de 60 segundos. Si no se intercambian datos entre ALB y un servidor de backend durante más de 60 segundos, ALB cierra la conexión.
Si el tiempo de espera predeterminado de 60 segundos no es suficiente para sus necesidades, modifique el parámetro Connection Request Timeout del listener.
Para mantener la conexión abierta, implemente un mecanismo keepalive que intercambie paquetes como mínimo una vez cada 60 segundos.
Requisitos previos
Se requiere una instancia de ALB orientada a Internet. Para obtener más información, consulte Create and manage an ALB instance.
-
Se requieren tres instancias ECS: ECS01, ECS02 y ECS03.
ECS01 y ECS02 se utilizan para desplegar la aplicación WebSocket, mientras que ECS03 se usa para desplegar Redis.
En este tutorial, todos los servidores ejecutan CentOS 7.9.
Se recomienda colocar ECS01, ECS02 y ECS03 en el mismo security group. Si están en diferentes security groups, asegúrese de configurar reglas que permitan el tráfico en los puertos de comunicación necesarios entre los servidores.
Se requiere un nombre de dominio registrado con un registro ICP completado. Para obtener más información, consulte Register an Alibaba Cloud domain name y ICP filing.
Procedimiento
Paso 1: Desplegar los servicios
Debe desplegar Redis en la instancia ECS03 y la aplicación WebSocket en las instancias ECS01 y ECS02.
Este tema utiliza una sala de chat en línea sencilla basada en Python sobre CentOS 7.9 con fines de demostración. Este ejemplo es solo de referencia. En un entorno de producción, utilice su propia aplicación.
Desplegar Redis en ECS03
Inicie sesión en la instancia ECS03.
-
Copie y ejecute los siguientes comandos para instalar y configurar Redis.
# Install EPEL (Extra Packages for Enterprise Linux) sudo yum install epel-release -y # Install Redis sudo yum install redis -y # Start and enable the Redis service sudo systemctl start redis sudo systemctl enable redis # Edit the Redis configuration file to allow remote connections sudo sed -i 's/^bind 127.0.0.1$/bind 0.0.0.0/' /etc/redis.conf sudo sed -i 's/^protected-mode yes/protected-mode no/' /etc/redis.conf # Restart the Redis service for the changes to take effect sudo systemctl restart redis # Check the Redis status sudo systemctl status redis -
Si los comandos se ejecutan sin errores y la salida muestra que el servicio Redis está en estado active (running), el despliegue y la configuración se completaron correctamente.
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Active: active (running) since ... Main PID: 12345 (redis-server) CGroup: /system.slice/redis.service └─12345 /usr/bin/redis-server 0.0.0.0:6379
Desplegar WebSocket en ECS01
Inicie sesión en la instancia ECS01.
Ejecute
sudo pip3 install flask flask-socketio flask-cors redispara instalar las dependencias.Ejecute
vi ECS01_ws.pyy presione la teclaipara entrar al modo de edición.-
Copie y pegue el siguiente código:
Presione la tecla
Escy luego introduzca:wqpara guardar los cambios.Ejecute el comando
sudo python3 ECS01_ws.pypara ejecutar el script.-
Cuando aparezca la siguiente salida, la aplicación WebSocket se habrá iniciado en el puerto 5000.
Server initialized for threading. * Serving Flask app 'ECS01_ws' (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on all addresses. WARNING: This is a development server. Do not use it in a production deployment. * Running on http://192.168.*.*:5000/ (Press CTRL+C to quit)Si la aplicación no se inicia, compruebe si el puerto ya está en uso o si copió los comandos o el código de forma incorrecta.
● redis.service – Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/redis.service.d
└─limit.conf
Active: active (running) since Thu 2xxx xxx xxx xxx CST; 6s ago
Process: 14715 ExecStop=/usr/libexec/redis-shutdown (code=exited, status=0/SUCCESS)
Main PID: 14730 (redis-server)
CGroup: /system.slice/redis.service
└─14730 /usr/bin/redis-server 0.0.0.0:6379
Desplegar WebSocket en ECS02
Inicie sesión en la instancia ECS02.
Ejecute
sudo pip3 install flask flask-socketio flask-cors redispara instalar las dependencias.Ejecute
vi ECS02_ws.pyy presione la teclaipara entrar al modo de edición.-
Copie y pegue el siguiente código:
Presione la tecla
Escy luego introduzca:wqpara guardar los cambios.Ejecute el comando
sudo python3 ECS02_ws.pypara ejecutar el script.-
Cuando aparezca la siguiente salida, la aplicación WebSocket se habrá iniciado en el puerto 5000.
Server initialized for threading. * Serving Flask app 'ECS02_ws' (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on all addresses. WARNING: This is a development server. Do not use it in a production deployment. * Running on http://192.168.*.*:5000/ (Press CTRL+C to quit)Si la aplicación no se inicia, compruebe si el puerto ya está en uso o si copió los comandos o el código de forma incorrecta.
Paso 2: Configurar un grupo de servidores
Inicie sesión en la consola de ALB.
En la barra de navegación superior, seleccione la región donde se desplegó la instancia.
En el panel de navegación izquierdo, haga clic en Server Group.
-
Haga clic en Create Server Group. En la página Create Server Group, configure los siguientes parámetros, deje los demás con sus valores predeterminados y haga clic en Create.
Parámetro
Descripción
Server Group Type
Seleccione Server.
VPC
Seleccione la VPC donde se encuentran los servidores de backend ECS01 y ECS02.
Los servidores de backend deben estar en la misma VPC que la instancia de ALB.
En el cuadro de diálogo The server group is created, haga clic en Add Backend Server.
En la página Add Backend Server, seleccione ECS01 y ECS02, y agréguelos al grupo de servidores. Establezca su puerto en 5000, que es el puerto utilizado por la aplicación WebSocket en este tutorial.
Paso 3: Configurar un listener HTTP
Inicie sesión en la consola de ALB.
En la barra de navegación superior, seleccione la región donde se desplegó la instancia.
En el panel de navegación izquierdo, seleccione Instances.
En la página Instances, busque la instancia de destino y haga clic en Create Listener en la columna Actions.
-
En la página Configure Listener, configure los siguientes parámetros y deje los demás con sus valores predeterminados. Luego, haga clic en Next.
Parámetro
Descripción
Select Listener Protocol
Seleccione HTTP.
Listener Port
Establezca el puerto en 5000.
-
En la página Server Group, configure el siguiente parámetro y deje los demás con sus valores predeterminados. Luego, haga clic en Next.
Parámetro
Descripción
Server Group
Seleccione el grupo de servidores que creó.
En la página Confirm, revise la configuración y haga clic en Submit. Después, espere a que se cree el listener.
Paso 4: Configurar la resolución DNS
Para entornos de producción, se recomienda asignar un nombre de dominio personalizado al nombre de dominio de la instancia de ALB mediante la creación de un registro CNAME.
En el panel de navegación izquierdo, elija .
En la página Instances, copie el nombre DNS de la instancia ALB creada.
-
Siga estos pasos para agregar un registro CNAME.
NotaSi su nombre de dominio está registrado con un proveedor distinto de Alibaba Cloud, debe agregarlo a la consola de Alibaba Cloud DNS antes de poder configurar la resolución DNS. Para obtener más información, consulte Manage domain names. Si su nombre de dominio está registrado en Alibaba Cloud, continúe con los siguientes pasos.
Inicie sesión en la consola de Alibaba Cloud DNS.
En la página Public Zone, busque el nombre de dominio de destino y haga clic en Settings en la columna Operations.
En la página Settings, haga clic en Add Record.
-
En el panel Add Record, configure el registro CNAME estableciendo los siguientes parámetros y luego haga clic en OK.
Parámetro
Descripción
Record Type
Seleccione CNAME en la lista desplegable.
Hostname
El prefijo de su nombre de dominio. Este tutorial utiliza @.
NotaPara usar un dominio raíz, establezca el nombre de host en
@.Query Source
Seleccione Default.
Record Value
Introduzca el nombre DNS de la instancia ALB que copió.
TTL
El tiempo de vida (TTL) es la duración durante la cual un registro DNS se almacena en caché en un servidor DNS. Utilice el valor predeterminado.
Paso 5: Comprobar el resultado
Compruebe que ALB entrega mensajes en tiempo real a través de WebSocket. Para ello, abra la aplicación en un navegador desde dos computadoras distintas e intercambie mensajes.
-
En un navegador, vaya a
http://<your-domain-name>:5000para acceder a la aplicación de sala de chat en línea.Se carga la interfaz Online Chat Room. El mensaje "You have entered the chat room!" aparece en el área de mensajes del chat, lo que indica que la conexión WebSocket se estableció. La página contiene un área de configuración de nombre de usuario con un botón Set Username y un área de envío de mensajes con un botón Send.
Si abre las herramientas de desarrollador de su navegador, la pestaña Network muestra que el navegador se comunica mediante el protocolo WebSocket.
En el panel Network, establezca el filtro en
websocket. Una solicitud WebSocket con un código de estado 101 indica que la actualización del protocolo se completó correctamente. El estado de la conexión es Pending, lo que significa que la conexión persistente de WebSocket se estableció y está activa. Introduzca un nombre de usuario para el chat y haga clic en Set Username.
-
En cada computadora, introduzca varios mensajes de chat y haga clic en Send para probar la aplicación.
Ambos navegadores reciben los mensajes en tiempo real.
La aplicación Online Chat Room se desplegó correctamente. La página contiene un cuadro de entrada Username y un botón Set Username, un área de visualización de mensajes de chat y un cuadro de entrada de mensajes con un botón Send en la parte inferior. Varios usuarios, como User1 y User2, pueden mantener una conversación en tiempo real en la sala de chat.
Esto confirma que ALB proporciona mensajería en tiempo real y de alta disponibilidad a través de WebSocket.
Preguntas frecuentes
¿Cómo uso WebSocket Secure?
WebSocket Secure es la versión cifrada del protocolo WebSocket.
Los listeners HTTPS admiten WebSocket Secure de forma predeterminada. Para usar WebSocket Secure, seleccione HTTPS cuando configure el listener.
¿Se me cobra por usar WebSocket?
WebSocket y WebSocket Secure no generan cargos adicionales.
¿Qué regiones admiten WebSocket?
Todas las regiones que admiten ALB también admiten WebSocket y WebSocket Secure.
Referencias
Este tutorial demuestra cómo desplegar Redis en una instancia ECS para realizar pruebas. Sin embargo, un único servidor Redis representa un posible punto único de falla. Para entornos de producción, se recomienda utilizar Tair para garantizar la alta disponibilidad. Para obtener más información, consulte Quick start for Tair.