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 la aplicación, entre los que 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 escalamiento manual para una aplicación, las instancias en las que se ejecuta son instancias residentes. Si utilizas el escalamiento 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 escalamiento automático utilizan instancias dinámicas.
  • Los servicios de escalamiento manual utilizan instancias residentes.
  • Los servicios de escalamiento 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 se lo configuró.

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 de la 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 utilizas escalamiento automático, puedes optimizar el comportamiento del programador a fin de obtener el equilibrio deseado entre el rendimiento y el costo, mediante la configuración de los valores para target_cpu_utilization, target_throughput_utilization y max_concurrent_requests.

Parámetro de escalamiento 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 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 eficiencia y rentabilidad óptima.

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 appengine-web.xml 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.

Escalamiento manual
Un servicio con escalamiento 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.
Escalamiento automático
Los servicios de escalamiento 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.
Escalamiento básico
Los servicios con escalamiento 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 escalamiento 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:

Función Escalamiento automático Escalamiento manual Escalamiento 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 ha estado inactiva, por ejemplo, no ha recibido 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 manualmente 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 controlar las solicitudes y se rechazan automáticamente cuando están inactivas, de acuerdo con el parámetro de configuración idle-timeout. Al igual que con el escalamiento manual, una instancia que se detiene manualmente, tiene 30 segundos para terminar de controlar 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" puede direccionarse en la URL: http://i.v.s.app_id.appspot.com. Si has configurado una asignación de subdominio de comodín 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 escalamiento 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, 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. 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 instancias 8 horas de instancias 8 horas de instancias

Ciclo de vida de la instancia

Estados de las instancias

Una instancia de un servicio con escalamiento automático siempre se ejecuta. 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. Puedes cambiar el estado de las instancias; para ello, detén las versiones con el uso de la página Versiones en GCP Console, los comandos appcfg.sh start_module_version y appcfg.sh stop_module_version o el servicio Modules.

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 escalamiento 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 escalamiento manuales, básicas y automáticas se inician de manera diferente. Cuando inicias una instancia de escalamiento manual, App Engine envía inmediatamente 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 recibe su primera solicitud de usuario. Varias instancias de escalamiento básico solo se inician según sea necesario a fin de controlar el aumento de tráfico. Las instancias con escalamiento 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 escalamiento manual se reinician de forma inmediata, mientras que las instancias con escalamiento 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:

  • La detención manual de una instancia
  • La implementación de 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 instancias
  • 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 de que una aplicación determine si una instancia de escalamiento manual está a punto de cerrarse. Primero, el método isShuttingDown() comienza a mostrar true. En segundo lugar (y la opción preferida), si registraste un gancho de cierre, se lo llamará. 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.

Apenas App Engine comienza a cerrar una instancia, todas las solicitudes nuevas muestran una respuesta 404 inmediatamente. Si la instancia está inactiva y hay un gancho de cierre, este se ejecuta de inmediato. Si la instancia está controlando una solicitud, cuenta con 30 segundos para finalizar antes de que se llame al gancho de cierre. Si el controlador no completa su operación, se interrumpe y se ejecuta el gancho de cierre.

Cuando App Engine comienza a cerrar una instancia, envía una solicitud /_ah/stop que aparece en el registro, pero que la lógica de control de solicitudes ignora y que el código de usuario no puede controlar.

El siguiente ejemplo de código representa un gancho de cierre básico:

LifecycleManager.getInstance().setShutdownHook(new ShutdownHook() {
  public void shutdown() {
    LifecycleManager.getInstance().interruptAllRequests();
  }
});

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

while (haveMoreWork()
&& !LifecycleManager.getInstance().isShuttingDown()) {
  doSomeWork();
  saveState();
}

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 cargar 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 escalamiento 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 Configurar solicitudes de preparación.

Tiempo de actividad de la instancia

App Engine intenta mantener las instancias de escalamiento 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 que 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á solo por las instancias inactivas hasta el número de instancias inactivas máximas 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:

  • Para 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 terminó de procesarse.
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Java