Cómo administrar instancias

Las instancias son los elementos fundamentales de App Engine, que proporcionan todos los recursos necesarios para alojar con éxito tu aplicación, En cualquier momento, tu aplicación puede ejecutarse en una o varias instancias con solicitudes distribuidas en todas ellas. Cada instancia incluye una capa de seguridad para garantizar que las instancias no puedan afectarse mutuamente de forma involuntaria.

App Engine puede crear y cerrar instancias automáticamente a medida que el tráfico fluctúa, o puedes especificar una cantidad de instancias para ejecutar, independientemente de la cantidad de tráfico. Para determinar cómo y cuándo se crean las instancias nuevas, debes especificar un tipo de ajuste de escala para tu app.

Tipos de escalamiento

App Engine admite los siguientes tipos de escalamientos, que controlan cómo y cuándo se crean las instancias:

  • Automatic
  • Basic
  • Manual

Debes especificar el tipo de escalamiento en el archivo appengine-web.xml de tu app.

Ajuste de escala automático
El ajuste de escala automático crea instancias según la tasa de solicitudes, las latencias de respuesta y otras métricas de la aplicación. Puedes especificar umbrales para cada una de estas métricas, así como una cantidad mínima de instancias que deben seguir ejecutándose en todo momento.
Escalamiento básico
El ajuste de escala básico crea instancias cuando tu aplicación recibe solicitudes. Cada instancia se cerrará cuando la aplicación esté inactiva. El ajuste de escala básico es ideal para trabajos intermitentes o que se generan con la actividad del usuario.
Escalamiento manual
El ajuste de escala manual especifica la cantidad de instancias que se ejecutan de forma continua independientemente del nivel de carga. Esto permite ejecutar tareas como inicializaciones complejas y aplicaciones que se basan en el estado de la memoria en el tiempo.
En la tabla siguiente, se comparan las características de rendimiento de los tres tipos de escalamiento:

Función Ajuste de escala automático Ajuste de escala básico Escalamiento manual
Tiempo de espera de la solicitud 10 minutos para las solicitudes HTTP y las tareas de la lista de tareas en cola (1 minuto en los entornos de ejecución de Java 8, PHP 5 y Python 2). Si tu app no muestra una solicitud dentro de este límite de tiempo, App Engine interrumpe el controlador de solicitudes y emite un error para que lo controla tu código. 24 horas para solicitudes HTTP y tareas de la lista de tareas en cola. Si tu app no muestra una solicitud dentro de este límite de tiempo, App Engine interrumpe el controlador de solicitudes y emite un error para que lo controle tu código.

Una instancia con escalamiento básico puede elegir controlar /_ah/start y ejecutar un programa o una secuencia de comandos durante muchas horas sin mostrar un código de respuesta HTTP.

Igual que el ajuste de escala básico.
Hilos en segundo plano No permitido Permitido Permitido
Residencia Las instancias se cierran según los patrones de uso. Las instancias se cierran según el parámetro idle-timeout. Si una instancia estuvo inactiva, por ejemplo, no recibió una solicitud por más de idle-timeout, la instancia se cierra. Las instancias permanecen en la memoria y el estado se conserva en todas las solicitudes. Cuando se reinician las instancias, aparece una solicitud /_ah/stop en los registros. Si existe un gancho de cierre registrado, tiene 30 segundos para completarse antes de que se produzca el cierre.
Inicio y cierre Las instancias se crean según demanda para controlar las solicitudes y se rechazan de forma automática cuando están inactivas. Las instancias se crean a pedido para manejar las solicitudes y se apagan automáticamente cuando están inactivas, según el parámetro de configuración idle-timeout. Una instancia que se detiene de forma manual tiene 30 segundos para terminar de administrar las solicitudes antes de que se fuerce la finalización. App Engine envía de manera automática una solicitud de inicio a las instancias con el formato de una solicitud GET vacía para /_ah/start. Al igual que con el ajuste de escala básico, una instancia que se detiene de forma manual tiene 30 segundos para terminar de administrar las solicitudes antes de que se fuerce la finalización.
Direccionamiento a instancias Las instancias son anónimas. Es posible dirigirse a la instancia “i” de la versión “v” del servicio “s” en la URL: https://i-dot-v-dot-s-dot-app_id.REGION_ID.r.appspot.com. Si configuraste una asignación de subdominio comodín para un dominio personalizado, también puedes dirigirte a un servicio o a cualquiera de sus instancias mediante una URL con el formato https://s.domain.com o https://i.s.domain.com. Puedes almacenar en caché de manera confiable el estado de cada instancia y recuperarlo en las solicitudes siguientes. Igual que el ajuste de escala básico.
Escalamiento App Engine escala el número de instancias de forma automática en respuesta al volumen de procesamiento. Este escalamiento se incluye en la configuración automatic_scaling que se proporciona por versión en el archivo de configuración. Un servicio con escalamiento básico se configura mediante el establecimiento de la cantidad máxima de instancias en el parámetro max_instances de la configuración basic_scaling. La cantidad de instancias activas se ajusta con el volumen de procesamiento. Tú configuras la cantidad de instancias de cada versión en el archivo de configuración de ese servicio. Por lo general, el número de instancias corresponde al tamaño de un conjunto de datos que se aloja en la memoria o la capacidad de procesamiento deseada para el trabajo sin conexión.

Cómo escalar instancias dinámicas

Las aplicaciones de App Engine que usan ajuste de escala automático o básico funcionan con cualquier cantidad de instancias dinámicas en un momento determinado, según el volumen de solicitudes entrantes. A medida que aumentan las solicitudes para tu aplicación, la cantidad de instancias dinámicas también puede aumentar.

Aplicaciones con ajuste de escala básico

Si usas el escalamiento básico, App Engine intenta mantener tu costo bajo, aunque eso puede dar como resultado una latencia más alta a medida que aumenta el volumen de solicitudes entrantes.

Cuando ninguna de las instancias existentes está disponible para entregar una solicitud entrante, App Engine inicia una nueva instancia. Incluso después de iniciar una instancia nueva, es posible que algunas solicitudes deban estar en cola hasta que la instancia nueva complete su proceso de inicio. Si necesitas la menor latencia posible, considera usar el ajuste de escala automático, que crea instancias nuevas de manera preventiva para minimizar la latencia.

Aplicaciones con ajuste de escala automático

Si usas el ajuste de escala automático, cada instancia de tu app tiene su propia cola para las solicitudes entrantes. Antes de que las colas sean lo suficientemente largas como para tener un efecto notable en la latencia de tu app, App Engine crea automáticamente una o más instancias nuevas para manejar la carga creciente.

Puedes establecer la configuración del ajuste de escala automático para lograr un equilibrio entre el rendimiento que deseas y el costo en el que puedes incurrir. En la siguiente tabla, se describen estas opciones de configuración.

Configuración de ajuste de escala automático Descripción
Uso de CPU objetivo Establece el límite de la tasa de uso de CPU a fin de especificar el límite de uso de esta en el que se iniciarán más instancias para controlar el tráfico.
Uso de rendimiento objetivo Establece el límite de la capacidad de procesamiento para la cantidad de solicitudes simultáneas después de las cuales se iniciarán más instancias con el fin de controlar el tráfico.
Número máximo de solicitudes simultáneas Establece la cantidad máxima de solicitudes simultáneas que una instancia puede aceptar antes de que el programador genere una instancia nueva.

Mira el video Configuración de programador nuevo de App Engine para ver los efectos de esta configuración.

Disminución del escalamiento

Cuando los volúmenes de solicitudes disminuyen, App Engine reduce la cantidad de instancias. Este escalamiento descendente ayuda a garantizar que todas las instancias actuales de tu aplicación se usen para lograr una eficiencia y eficacia en función del costo óptimas.

Cuando una aplicación no se utiliza en absoluto, App Engine desactiva las instancias dinámicas asociadas, pero las vuelve a cargar tan pronto como sea necesario. Volver a cargar las instancias puede dar lugar a la carga de solicitudes y latencia adicional para los usuarios.

Puedes especificar una cantidad mínima de instancias inactivas. Si estableces una cantidad adecuada de instancias inactivas para la aplicación en función del volumen de solicitudes, permitirás que la aplicación entregue todas las solicitudes con poca latencia, a menos que tengas un volumen de solicitudes más alto de lo común.

Escalamiento y lotes de solicitudes

Si envías lotes de solicitudes a tus servicios, por ejemplo, a una lista de tareas en cola para que se procesen, se creará una gran cantidad de instancias rápidamente. Para controlar esto, recomendamos establecer un límite de frecuencia a la cantidad de solicitudes enviadas por segundo, si es posible. Por ejemplo, si usas Tasks, puedes controlar la velocidad a la que se envían las tareas.

Ciclo de vida de la instancia

Estados de la instancia

Una instancia de un servicio con ajuste de escala automático siempre está en ejecución. Sin embargo, una instancia de un servicio con escalamiento manual o básico puede ejecutarse o detenerse. Todas las instancias del mismo servicio y la misma versión comparten el mismo estado. Debes cambiar el estado de tus instancias mediante la administración de las versiones. Puede hacer lo siguiente:

Inicio

Cada instancia de servicio se crea como respuesta a una solicitud de inicio, que es una solicitud HTTP GET vacía a /_ah/start. App Engine envía esta solicitud para crear una instancia; los usuarios no pueden enviar una solicitud a /_ah/start. Las instancias de ajuste de escala manual y básico deben responder a la solicitud de inicio antes de que puedan administrar otra solicitud. La solicitud de inicio puede usarse para dos motivos:

  • Iniciar un programa que se ejecuta indefinidamente, sin aceptar más solicitudes
  • Inicializar una instancia antes de recibir tráfico adicional

Las instancias de ajuste de escala manual, básico y automático se inician de manera diferente. Cuando inicias una instancia de ajuste de escala manual, App Engine envía de inmediato una solicitud /_ah/start a cada instancia. Cuando inicias una instancia de un servicio de escalamiento básico, App Engine le permite aceptar tráfico, pero la solicitud /_ah/start no se envía a una instancia hasta que reciba su primera solicitud de un usuario. Las instancias de ajuste de escala básico múltiple solo se inician según sea necesario, a fin de administrar el aumento de tráfico. Las instancias de ajuste de escala automático no reciben ninguna solicitud /_ah/start.

Cuando una instancia responde a una solicitud /_ah/start con un código de estado HTTP de 200–299404, se considera que se inició de forma correcta y que puede controlar solicitudes adicionales. De lo contrario, App Engine cancelará la instancia. Las instancias con ajuste de escala manual se reinician de forma inmediata, mientras que las instancias con ajuste de escala básico se reinician solo cuando es necesario para entregar tráfico.

Cierre

El proceso de cierre se puede activar mediante una variedad de eventos planificados y no planificados, como los siguientes:

  • Se detiene una instancia manualmente.
  • Se implementa una versión actualizada en el servicio.
  • La instancia excede la memoria máxima para su instance_class configurada.
  • La aplicación agota su cuota de horas de instancia.
  • La instancia se mueve a una máquina diferente, ya sea porque se reinicia la máquina actual que ejecuta la instancia, o App Engine movió la instancia para mejorar la distribución de la carga

Solicitudes de carga

Cuando App Engine crea una instancia nueva para la aplicación, la instancia debe cargar primero las bibliotecas y los recursos necesarios con el objetivo de controlar la solicitud. Esto sucede durante la primera solicitud a la instancia, denominada solicitud de carga. Durante una solicitud de carga, la aplicación se inicializa, lo que hace que la solicitud tarde más tiempo.

Las siguientes recomendaciones te permiten reducir la duración de las solicitudes de carga:

  • Carga solo el código que se necesita para el inicio.
  • Accede al disco lo menos posible.
  • En algunos casos, cargar un código desde un archivo ZIP o JAR es más rápido que cargarlo desde muchos archivos separados.

Solicitudes de preparación

Las solicitudes de preparación son un tipo específico de solicitudes de carga que suben el código de aplicación en una instancia con anticipación, antes de que se realicen solicitudes en tiempo real. Las instancias de ajuste de escala manual o básico no reciben una solicitud /_ah/warmup.

Para obtener más información sobre cómo utilizar las solicitudes de preparación, consulta Configura solicitudes de preparación para mejorar el rendimiento.

Tiempo de actividad de la instancia

App Engine intenta mantener las instancias de ajuste de escala manual y básico en ejecución de forma indefinida. Sin embargo, en este momento no existe un tiempo de actividad garantizado para las instancias de escalamiento manual y básico. Las fallas de hardware y software que generan la finalización temprana o los reinicios frecuentes pueden ocurrir sin previo aviso, y puede llevar mucho tiempo resolverlas; por lo tanto, debes construir la aplicación de una manera que tolere estas fallas.

A continuación, se detallan algunas estrategias útiles para evitar el tiempo de inactividad debido a los reinicios de la instancia:

  • Reduce el tiempo que lleva reiniciar tus instancias o iniciar las nuevas.
  • Crea puntos de control de forma periódica para los cálculos de larga duración, a fin de permitirte reanudar el proceso desde ese estado.
  • La app debe ser "sin estado" para que no se almacene nada en la instancia.
  • Usa colas para ejecutar tareas asíncronas.
  • Si configuras tus instancias para el ajuste de escala manual, haz lo siguiente:
    • Usa el balanceo de cargas en varias instancias.
    • Configura más instancias de las necesarias para controlar un tráfico normal.
    • Escribe una lógica de resguardo que use resultados almacenados en caché cuando no esté disponible una instancia de escalamiento manual.