Puedes usar WebSockets para crear una conexión continua desde un cliente (como un dispositivo móvil o una computadora) hasta una instancia de App Engine. La conexión abierta permite el intercambio de datos en dos direcciones entre el cliente y el servidor en cualquier momento, lo que genera una latencia menor y un uso mejor de los recursos.
WebSockets
El protocolo de WebSockets, definido en RFC 6455, proporciona un canal de comunicación dúplex completo entre un cliente y un servidor. El canal se inicia a partir de una solicitud HTTP(S) con un encabezado de "actualización".
Los casos prácticos típicos de WebSockets incluyen lo siguiente:
- Actualizaciones de eventos en tiempo real, como los feeds de redes sociales, resultados deportivos, noticias o precios del mercado de valores.
- Notificaciones de usuario, como actualizaciones de software o de contenido.
- Aplicaciones para chatear.
- Herramientas de edición colaborativas.
- Juegos multijugador
Los WebSockets siempre están disponibles para tu aplicación y no requieren de ninguna configuración adicional. Una vez establecida la conexión de WebSockets, el tiempo de espera se agotará después de una hora. El uso del WebSocket se factura por el uso de la conexión hasta el tiempo de espera o la finalización del socket.
Ejecuta una aplicación de muestra con WebSockets
Requisitos previos y configuración
En las muestras de código de este documento, se describe cómo ejecutar una aplicación de ejemplo con la aplicación con WebSockets para el entorno de ejecución de Python versión 3.7 y anteriores. Para la versión 3.8 y posteriores de Python, consulta Entorno de ejecución de Python a fin de obtener más información sobre el uso de versiones más recientes.
Sigue las instrucciones en Configura tu entorno de desarrollo para configurar tu entorno y proyecto, y comprender cómo se estructuran las apps.
Clona la app de muestra
Copia las apps de muestra en tu máquina local y navega hasta el directorio websockets
:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible_python37_and_earlier/websockets/
Ejecuta la muestra de forma local
Para ejecutarla de forma local, debes usar Gunicorn con el trabajador flask_socket
:
$ gunicorn -b 127.0.0.1:8080 -k flask_sockets.worker main:app
Implementa y ejecuta la muestra en App Engine
Para implementar la aplicación en el entorno flexible de App Engine, ejecuta el siguiente comando desde el directorio en el que se encuentra tu app.yaml
:
gcloud app deploy
Luego, puedes dirigir tu navegador a
https://PROJECT_ID.REGION_ID.r.appspot.com
Afinidad de sesión
Algunos clientes no son compatibles con WebSockets. Para solucionar este problema, muchas aplicaciones usan bibliotecas como socket.io que recurren a http long polling con los clientes que no son compatibles con WebSockets.
Por lo general, App Engine distribuye las solicitudes de modo uniforme entre las instancias disponibles. De todas formas, cuando se usa http long polling, varias solicitudes secuenciales de un usuario determinado tienen que alcanzar la misma instancia.
Para permitir que App Engine envíe solicitudes por el mismo usuario a la misma instancia, puedes habilitar la afinidad de sesión. Luego, App Engine identifica las solicitudes que se envían desde los mismos usuarios mediante la inspección de una cookie y el enrutamiento de esas solicitudes a la misma instancia.
La afinidad de sesión en App Engine se implementa sobre la base del "mejor esfuerzo". Cuando se implementa una aplicación, siempre se debe suponer que la afinidad de sesión no está garantizada. Un cliente puede perder afinidad con la instancia de destino en estas situaciones:
- El escalador automático de App Engine puede agregar o quitar las instancias que entrega tu aplicación. La aplicación podría reasignar la carga y se podría mover la instancia de destino. Con el fin de minimizar este riesgo, asegúrate de configurar el número mínimo de instancias para manejar la carga esperada.
- Si la instancia de destino no pasa las verificaciones de estado, App Engine mueve la sesión a una instancia en buen estado. Para obtener más información sobre las verificaciones de estado y sus opciones de personalización, consulta Divide las verificaciones de estado.
- La afinidad de sesión se pierde cuando una instancia se reinicia por mantenimiento o por actualizaciones de software. Las instancias de VM del entorno flexible de App Engine se reinician cada semana.
Debido a que la afinidad de sesión no está garantizada, solo debes usarla con el fin de aprovechar la capacidad de socket.io
y de otras bibliotecas para recurrir al sondeo largo de HTTP en los casos en que la conexión se interrumpa. Nunca debes usar la afinidad de sesión para compilar aplicaciones con estado.
Habilita e inhabilita la afinidad de sesión
De forma predeterminada, la afinidad de sesión está inhabilitada para todas las aplicaciones de App Engine. La afinidad de sesión se configura en el nivel de versión de tu aplicación y se puede habilitar o inhabilitar durante la implementación.
Para habilitar la afinidad de sesión en tu versión de App Engine, agrega la siguiente entrada a tu archivo app.yaml
:
network:
session_affinity: true
Una vez que la versión se implementa con el archivo app.yaml actualizado, las solicitudes nuevas comenzarán a entregarse desde la misma instancia siempre que esta esté disponible.
Para desactivar la afinidad de la sesión, quita la entrada de tu archivo app.yaml
o establece el valor como falso:
network:
session_affinity: false