Cómo se administran las instancias

Las instancias son los elementos básicos de App Engine que proporcionan todos los recursos necesarios para alojar con éxito la aplicación. En cualquier momento, la aplicación se puede ejecutar 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 apagar instancias de forma automática a medida que el tráfico fluctúa, o puedes especificar una cantidad de instancias que se deben ejecutar, sin importar la cantidad de tráfico. A fin de determinar cómo y cuándo se crean las instancias nuevas, debes especificar un tipo de escalamiento para la app. La configuración de escalamiento se aplica a nivel de versión de App Engine como parte del archivo app.yaml.

Tipos de escalamiento

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

  • Automática (predeterminado)
  • Básico
  • Manual

Debes especificar el tipo de escalamiento en el archivo app.yaml de la app. De forma predeterminada, la app usa el ajuste de escala automático, lo que significa que App Engine administrará la cantidad de instancias inactivas.

Ajuste de escala automático
El ajuste de escala automático crea instancias según el porcentaje 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 mediante la configuración del elemento automatic_scaling.
Ajuste de escala básico
El ajuste de escala básico crea instancias cuando la aplicación recibe solicitudes. Cada instancia se apagará cuando la aplicación esté inactiva. El ajuste de escala básico es ideal para trabajos intermitentes o que se generan mediante la actividad del usuario.
Ajuste de escala manual
El ajuste de escala manual especifica la cantidad de instancias que se ejecutan de forma continua sin importar el nivel de carga. Esto permite ejecutar tareas como inicializaciones y aplicaciones complejas 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 Ajuste de escala manual
Tiempo de espera de la solicitud 10 minutos para las solicitudes HTTP y las tareas de la lista de tareas en cola. Si la 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.

En el caso de los entornos de ejecución heredados (Java 8, PHP 5 y Python 2) sucede lo siguiente:

  • El tiempo de espera para las tareas de la lista de tareas en cola y las solicitudes de los trabajos cron es de 10 minutos.
  • El tiempo de espera para otras solicitudes HTTP es de 1 minuto.
24 horas para solicitudes HTTP y tareas de la lista de tareas en cola. Si la 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 ajuste de escala 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.

Es igual que el ajuste de escala básico.
Residencia Las instancias se apagan según los patrones de uso. Las instancias se apagan según el parámetro idle_timeout. Si una instancia estuvo inactiva, por ejemplo, no recibió una solicitud por un tiempo mayor al idle_timeout, se apaga. Las instancias permanecen en la memoria y el estado se conserva en todas las solicitudes. Cuando se detienen las instancias, aparece una solicitud /_ah/stop en los registros. Si hay un controlador /_ah/stop, tiene 30 segundos para completarse antes de que se produzca el apagado.
Inicio y apagado Las instancias se crean a pedido para controlar las solicitudes y se apagan de forma automática cuando están inactivas. Las instancias se crean a pedido para controlar las solicitudes y se apagan de forma automática 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 controlar 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 a /_ah/start. Al igual que sucede con el ajuste de escala básico, una instancia que se detiene de forma manual tiene 30 segundos para terminar de controlar 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. Es 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. Estos factores de escala se incluyen en la configuración automatic_scaling que se proporciona por versión en el archivo de configuración. Un servicio con ajuste de escala 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, la cantidad 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.

Escala instancias dinámicas

Las aplicaciones de App Engine que usan el 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 la aplicación, la cantidad de instancias dinámicas también puede aumentar.

Apps con ajuste de escala básico

Si usas el ajuste de escala básico, App Engine intenta mantener el 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 instancia nueva. 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 interrumpibles nuevas para minimizar la latencia.

Apps con ajuste de escala automático

Si usas el ajuste de escala automático, cada instancia de la app tiene su propia cola para las solicitudes entrantes. Antes de que las colas sean tan largas como para tener un efecto notable en la latencia de la app, App Engine crea de forma automática una o más instancias nuevas a fin de controlar 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 que puedes pagar. En la siguiente tabla, se describen estas opciones de configuración.

Opciones de configuración del 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 capacidad de procesamiento 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.
Máx. 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 Configuraciones del programador de App Engine para ver los efectos de estas configuraciones.

Disminución del escalamiento

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

Cuando una aplicación no se usa en absoluto, App Engine desactiva las instancias dinámicas asociadas, pero las vuelve a cargar en cuanto 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.

Cómo reducir la escala verticalmente en el ajuste de escala automático

Si la app usa el ajuste de escala automático, las instancias inactivas tardan unos 15 minutos en comenzar a desactivarse. Para mantener una o más instancias inactivas en ejecución, establece el valor de min_idle_instances en 1 o superior.

Escalamiento y lotes de solicitudes

Si envías lotes de solicitudes a los servicios (por ejemplo, a una lista de tareas en cola) para que se procesen, se creará una gran cantidad de instancias en poco tiempo. A fin de controlar esto, recomendamos establecer un límite de frecuencia para la cantidad de solicitudes que se envían por segundo, si es posible. Por ejemplo, si usas Google Tasks, puedes controlar la frecuencia con 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. Puedes 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 fines:

  • Iniciar un programa que se ejecuta de forma indefinida, 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.

Apagar

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

  • Hay demasiadas instancias y no hay suficientes solicitudes de aplicaciones (tráfico).
  • 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

Uno de los beneficios la plataforma “pagar solo por lo que necesitas” del entorno estándar de App Engine, como se describió antes en Reduce la escala verticalmente, es que el sistema escala de forma automática la cantidad de instancias a cero cuando no hay tráfico. Esto ayuda a que App Engine sea una solución rentable para aplicaciones pequeñas que no reciben solicitudes continuas. Cuando una instancia se debe cerrar, las nuevas solicitudes entrantes se enrutan a otras instancias (si las hubiera) y se concede tiempo a las solicitudes que se están procesando para completarse.

Cuando una instancia se debe cerrar, App Engine envía una señal KILL (SIGKILL) y la cierra.

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 prácticas recomendadas 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 con un 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, para 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.

NTP con entorno estándar de App Engine

El entorno estándar de App Engine tiene servicios de protocolo NTP que usan servidores NTP de Google. Sin embargo, el servicio NTP no es editable.