Cómo se administran las instancias

Las instancias son los elementos fundamentales de App Engine, que proporcionan todos los recursos necesarios para alojar con éxito tu aplicación, entre los que se incluyen el entorno de ejecución de lenguaje, las API de App Engine, y el código y la memoria de la aplicación. Cada instancia incluye una capa de seguridad para garantizar que las instancias no puedan afectarse mutuamente de forma involuntaria.

Las instancias son las unidades de computación que utiliza App Engine para ajustar la escala de la aplicación automáticamente. En cualquier momento, la aplicación se puede ejecutar en una o varias instancias, y las solicitudes se propagan por todas estas.

Introducción a las instancias

Las instancias son residentes o dinámicas. Una instancia dinámica se inicia y se cierra automáticamente según las necesidades actuales. Una instancia residente se ejecuta todo el tiempo, lo que puede mejorar el rendimiento de la aplicación. Tanto las instancias dinámicas como las residentes crean el código incluido en una versión de servicio de App Engine.

Si utilizas el ajuste de escala manual para una aplicación, las instancias en las que se ejecuta son instancias residentes. Si utilizas el ajuste de escala básico o automático, la aplicación se ejecuta en instancias dinámicas.

Para configurar la aplicación, también se debe especificar la forma en que se escalan los servicios, lo cual incluye lo siguiente:

  • La cantidad inicial de instancias para un servicio
  • La forma en la que se crean o se detienen las instancias nuevas en respuesta al tráfico
  • El tiempo asignado en el que una instancia puede controlar una solicitud

El tipo de escalamiento que asignas a un servicio determina si las instancias son residentes o dinámicas:

  • Los servicios de ajuste de escala automático utilizan instancias dinámicas.
  • Los servicios de ajuste de escala manual utilizan instancias residentes.
  • Los servicios de ajuste de escala básico utilizan instancias dinámicas.

App Engine cobra por el uso de las instancias cada hora. Puedes hacer un seguimiento del uso de instancias en la página Instancias de Google Cloud Platform Console. Si deseas establecer un límite para los costos asociados a las instancias, configura un límite de gasto. Cada servicio que implementas en App Engine se comporta como un microservicio que se escala de manera independiente según cómo lo hayas configurado.

Cómo escalar instancias dinámicas

Las aplicaciones de App Engine usan las instancias dinámicas necesarias para un momento determinado, según el volumen de las solicitudes entrantes. A medida que aumentan las solicitudes para tu aplicación, también se incrementa la cantidad de instancias dinámicas.

El programador de App Engine decide si entregará cada nueva solicitud con una instancia existente (ya sea una inactiva o una que acepta solicitudes simultáneas), si pondrá la solicitud en una lista de solicitudes pendientes o si comenzará una instancia nueva para esa solicitud. La decisión considera la cantidad de instancias disponibles, la rapidez con la que tu aplicación entrega las solicitudes (su latencia) y el tiempo que lleva empezar una nueva instancia.

Si usas el ajuste de escala automático, puedes optimizar el comportamiento del programador a fin de obtener el balance deseado entre rendimiento y costo si estableces los valores para target_cpu_utilization, target_throughput_utilization y max_concurrent_requests.

Parámetro 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 la 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.
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 Nuevas configuraciones del programador de App Engine para ver los efectos de estas configuraciones.

Cada instancia tiene su propia cola para las solicitudes entrantes. App Engine supervisa la cantidad de solicitudes en espera en la cola de cada instancia. Si App Engine detecta que las colas para una aplicación se hacen muy largas debido a la mayor carga, crea automáticamente una instancia nueva de la aplicación para controlar esa carga.

App Engine aumenta la escala muy rápidamente. Por lo tanto, si envías lotes de solicitudes a los servicios, por ejemplo, a una lista de tareas en cola para su procesamiento, se creará rápidamente un gran número de instancias. Para controlar esto, recomendamos establecer un límite de tasa a la cantidad de solicitudes enviadas por segundo, si es posible. Por ejemplo, en una lista de tareas en cola de App Engine, puedes controlar la velocidad a la que se envían las tareas.

App Engine también puede escalar instancias de forma inversa cuando los volúmenes de solicitudes disminuyen. Este 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 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 de instancias

Cuando subes una versión de un servicio, el archivo app.yaml especifica un tipo de escalamiento y una clase de instancia que se aplican a cada instancia de esa versión. El tipo de escalamiento controla cómo se crean las instancias. La clase de instancia determina los recursos de procesamiento (tamaño de la memoria y velocidad de la CPU) y los precios. Existen tres tipos de escalamiento: manual, básico y automático. Las clases de instancias disponibles dependen del tipo de escalamiento.

Ajuste de escala manual
Un servicio con ajuste de escala manual usa instancias residentes que ejecutan de manera continua la cantidad especificada de instancias, 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.
Ajuste de escala automático
Los servicios de ajuste de escala automático usan instancias dinámicas que se crean a partir del porcentaje de solicitudes, las latencias de respuesta y otras métricas de la aplicación. Sin embargo, si especificas una cantidad mínima de instancias inactivas, esa cantidad específica de instancias se ejecuta como instancias residentes, en tanto que cualquier instancia adicional será dinámica.
Ajuste de escala básico
Los servicios con ajuste de escala básico usan instancias dinámicas. Cada instancia se crea cuando la aplicación recibe una solicitud. La instancia se rechazará cuando la aplicación quede inactiva. El ajuste de escala básico es ideal para trabajos intermitentes o generados por la actividad del usuario.

En la tabla siguiente, se comparan las características de rendimiento de los tres tipos de escalamiento:

Característica Ajuste de escala automático Ajuste de escala manual Ajuste de escala básico
Plazos Plazo de 60 segundos paras las solicitudes HTTP; plazo de 10 minutos para las tareas de la lista de tareas en cola Las solicitudes se pueden ejecutar hasta 24 horas como máximo. Una instancia escalada de forma manual puede elegir controlar /_ah/start y ejecutar un programa o una secuencia de comandos durante varias horas, sin mostrar un código de respuesta HTTP. Las tareas de la lista de tareas en cola se pueden ejecutar hasta 24 horas como máximo. Igual que el escalamiento manual.
Subprocesos en segundo plano No permitido Permitido Permitido
Residencia Las instancias se expulsan de la memoria según los patrones de uso. 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. Las instancias se expulsan según el parámetro idle_timeout. Si una instancia, por ejemplo, estuvo inactiva por no recibir una solicitud durante más de idle_timeout, se la expulsa.
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. App Engine envía de forma automática una solicitud de inicio a las instancias en forma de una solicitud GET vacía a /_ah/start. 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. Las instancias se crean según demanda para abordar las solicitudes y se rechazan de forma automática cuando están inactivas, según el parámetro de configuración idle_timeout. Al igual que con el ajuste de escala manual, una instancia que se detiene de forma manual tiene 30 segundos para terminar de abordar las solicitudes antes de que se fuerce la finalización.
Direccionabilidad de las instancias Las instancias son anónimas. La instancia “i” de la versión “v” del servicio “s” se puede direccionar en la URL: http://i.v.s.app_id.appspot.com. Si configuraste un mapeo de subdominio de comodines para un dominio personalizado, también puedes direccionar un servicio o cualquiera de sus instancias a través de una URL con el formato http://s.domain.com o http://i.s.domain.com. Puedes almacenar en caché el estado de cada instancia de manera confiable y recuperarlo en solicitudes posteriores. Igual que el ajuste de escala manual.
Escalamiento App Engine escala el número de instancias de forma automática en respuesta al volumen de procesamiento. Este escalamiento considera la configuración de automatic_scaling que se proporciona por versión en el archivo de configuración. 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. Puedes ajustar la cantidad de instancias de una versión con escalamiento manual muy rápido, sin detener las instancias que están en ejecución con la función set_num_instances de la API de Módulos. Para configurar un servicio con escalamiento básico, se establece el número máximo de instancias en el parámetro max_instances del ajuste basic_scaling. La cantidad de instancias en vivo se ajusta con el volumen de procesamiento.
Cuota diaria de uso gratuito 28 horas de instancia 8 horas de instancia 8 horas de instancia

Ciclo de vida de las instancias

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 seguir estos pasos:

Inicio

Cada instancia de servicio se crea en respuesta a una solicitud de inicio, que es una solicitud GET HTTP vacía para /_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 controlar otra solicitud. La solicitud de inicio se puede utilizar para estos dos propósitos:

  • 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 inmediatamente una solicitud /_ah/start a cada instancia. Cuando inicias una instancia de un servicio de ajuste de escala básico, App Engine le permite aceptar tráfico, pero la solicitud /_ah/start no se envía a una instancia hasta que recibe su primera solicitud de usuario. Varias instancias de ajuste de escala básico solo se inician según sea necesario a fin de controlar el aumento de tráfico. Las instancias con ajuste de escala automático no reciben ninguna solicitud /_ah/start.

Cuando una instancia responde a la solicitud /_ah/start con un código de estado HTTP de 200–299 o 404, se considera que se inició de forma correcta y que puede controlar solicitudes adicionales. De lo contrario, App Engine cancela 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 supera 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
Hay dos maneras en que una aplicación determina si una instancia de escalamiento manual está a punto de cerrarse. En primer lugar, el método is_shutting_down() de google.appengine.api.runtime comienza a mostrar true. Como se describe a continuación, en segundo lugar (y preferido), puedes registrar un gancho de cierre.

Cuando App Engine comienza a cerrar una instancia, las solicitudes existentes tienen 30 segundos para completarse y las solicitudes nuevas muestran una respuesta 404 de inmediato. Si una instancia está controlando una solicitud, App Engine detiene la solicitud y ejecuta el gancho de cierre. Si no hay una solicitud activa, App Engine envía una solicitud /_ah/stop, que ejecuta el gancho de cierre. La solicitud /_ah/stop ignora la lógica de control normal, y el usuario del código no puede controlarla. Su único propósito es invocar el gancho de cierre. Si generas una excepción en tu gancho de cierre mientras controlas otra solicitud, se acumulará en la solicitud, donde podrás capturarla.

Si habilitaste solicitudes simultáneas especificando threadsafe: true en app.yaml (que es el valor predeterminado), generar una excepción desde un gancho de cierre realiza una copia de esa excepción en todos los subprocesos. En el siguiente ejemplo del código, se muestra un gancho de cierre básico:

from google.appengine.api import apiproxy_stub_map
from google.appengine.api import runtime

def my_shutdown_hook():
  apiproxy_stub_map.apiproxy.CancelApiCalls()
  save_state()
  # May want to raise an exception

runtime.set_shutdown_hook(my_shutdown_hook)

De manera alternativa, el siguiente ejemplo demuestra cómo utilizar el método is_shutting_down():

while more_work_to_do and not runtime.is_shutting_down():
  do_some_work()
  save_state()

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 solicitud de carga que sube 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 escalamiento 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 utilice resultados almacenados en caché cuando no esté disponible una instancia de escalamiento manual.

Facturación de las instancias

En general, las instancias se cobran por minuto durante el tiempo de actividad, además de una tarifa de inicio de 15 minutos (consulta Precios para obtener más información). Se te facturarán solo las instancias inactivas hasta el número máximo de instancias inactivas que establezcas para cada servicio. La sobrecarga del entorno de ejecución se cuenta de acuerdo con la memoria de la instancia. Esto será mayor en las aplicaciones de Java que en Python.

La facturación es un poco diferente en las instancias residentes y dinámicas:

  • En las instancias residentes, la facturación finaliza quince minutos después de que se cierra la instancia.
  • Para las instancias dinámicas, la facturación finaliza quince minutos después de que la última solicitud termina de procesarse.
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Python 2