Crea conexiones persistentes con WebSockets

ID de región

REGION_ID es un código abreviado que Google asigna en función de la región que seleccionas cuando creas la app. El código no corresponde a un país ni a una provincia, aunque algunos ID de región puedan parecer similares a los códigos de país y provincia que se suelen usar. En el caso de las apps creadas después de febrero de 2020, REGION_ID.r se incluye en las URL de App Engine. En el caso de las apps existentes creadas antes de esta fecha, el ID de región es opcional en la URL.

Obtén más información acerca de los ID de región.

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.

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

Primero, sigue las instrucciones que aparecen en "Hello, World!" para Ruby en App Engine, si deseas configurar tu entorno y proyecto, y comprender cómo se estructuran las apps de Ruby en App Engine.

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/ruby-docs-samples
cd ruby-docs-samples/appengine/websockets/

Ejecuta la muestra de forma local

  1. Instala las dependencias de este proyecto.

    bundle install
    
  2. Inicia un servidor web local.

    bundle exec ruby app.rb -p 8080
    
  3. En el navegador web, ingresa la siguiente dirección:

    http://localhost:8080
    

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