Crear conexiones persistentes con WebSockets

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.

Cómo ejecutar una aplicación de muestra con WebSockets

En las muestras de código de este documento, se describe cómo ejecutar una aplicación de ejemplo con WebSockets.

Requisitos previos y configuración

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:

Ejecuta la muestra de forma local

Implementa y ejecuta la muestra en App Engine

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