Las instancias son los componentes básicos de App Engine, que proporcionan todos los recursos necesarios para alojar correctamente tu aplicación. En cualquier momento, tu aplicación puede ejecutarse en una o varias instancias, y las solicitudes se distribuyen entre todas ellas. Cada instancia incluye una capa de seguridad para asegurarse de que las instancias no puedan afectarse entre sí por error.
App Engine puede crear y cerrar instancias automáticamente a medida que fluctúa el tráfico, o bien puedes especificar un número de instancias que se ejecuten independientemente de la cantidad de tráfico. Para determinar cómo y cuándo se crean las nuevas instancias, debes especificar un tipo de escalado para tu aplicación. Los ajustes de escalado se aplican a nivel de versión de App Engine como parte del archivo app.yaml.
Tipos de escalado
App Engine admite los siguientes tipos de escalado, que controlan cómo y cuándo se crean las instancias:
- Automática (predeterminada)
- Básico
- Manual
Puedes especificar el tipo de escalado en el archivo appengine-web.xml
de tu aplicación.
De forma predeterminada, tu aplicación usa el escalado automático, lo que significa que App Engine gestionará el número de instancias inactivas.
- Escalado automático
- El escalado automático crea instancias en función de la tasa de solicitudes, las latencias de respuesta y otras métricas de la aplicación. Puede especificar umbrales para cada una de estas métricas, así como un número mínimo de instancias que deben estar en ejecución en todo momento. Para ello, configure el elemento
automatic_scaling
.
- Escalado básico
- El escalado básico crea instancias cuando tu aplicación recibe solicitudes. Cada instancia se cerrará cuando la aplicación esté inactiva. El escalado básico es ideal para cargas de trabajo intermitentes o basadas en la actividad del usuario.
- Escalado manual
- El escalado manual especifica el número de instancias que se ejecutan de forma continua, independientemente del nivel de carga. Esto permite realizar tareas como inicializaciones complejas y aplicaciones que dependen del estado de la memoria a lo largo del tiempo.
Función | Escalado automático | Escalado básico | Escalado manual |
---|---|---|---|
Tiempo de espera de la solicitud |
10 minutos para solicitudes HTTP y tareas de colas de tareas. Si tu aplicación no devuelve una solicitud en este plazo, App Engine interrumpe el controlador de solicitudes y emite un error para que tu código lo gestione.
En el caso de los entornos de ejecución antiguos (Java 8, PHP 5 y Python 2):
|
24 horas para solicitudes HTTP y tareas de colas de tareas. Si tu aplicación no devuelve una solicitud en este plazo, App Engine interrumpe el controlador de solicitudes y emite un error para que tu código lo gestione.
Una instancia de escalado básico puede gestionar |
Es igual que el escalado básico. |
Hilos en segundo plano | No permitido | Permitido | Permitido |
Residencia | Las instancias se cierran en función de los patrones de uso. |
Las instancias se cierran en función del parámetro idle-timeout . Si una instancia ha estado inactiva (por ejemplo, no ha recibido ninguna solicitud durante más de idle-timeout ), se cerrará.
|
Las instancias permanecen en la memoria y el estado se conserva entre solicitudes. Cuando se detienen las instancias, aparece una solicitud /_ah/stop en los registros.
Si hay un controlador /_ah/stop o un hook de cierre registrado, tiene 30 segundos para completarse antes de que se produzca el cierre.
|
Inicio y apagado | Las instancias se crean bajo demanda para gestionar las solicitudes y se desactivan automáticamente cuando están inactivas. |
Las instancias se crean bajo demanda para gestionar las solicitudes y se cierran automáticamente cuando están inactivas, en función del parámetro de configuración idle-timeout . Una instancia que se ha detenido manualmente tiene 30 segundos para terminar de gestionar las solicitudes antes de que se termine de forma forzosa.
|
App Engine envía automáticamente a las instancias una solicitud de inicio en forma de solicitud GET vacía a /_ah/start . Al igual que con el escalado básico, una instancia que se detiene manualmente tiene 30 segundos para terminar de gestionar las solicitudes antes de que se cierre de forma forzosa.
|
Direccionamiento de instancias | Las instancias son anónimas. |
Se puede acceder a la instancia "i" de la versión "v" del servicio "s" a través de la URL:
https://i-dot-v-dot-s-dot-app_id.REGION_ID.r.appspot.com .
Si has configurado 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 forma fiable el estado de cada instancia y recuperarlo en solicitudes posteriores.
|
Es igual que el escalado básico. |
Escalado |
App Engine escala el número de instancias automáticamente en función del volumen de procesamiento. Estos factores de escalado se basan en los ajustes de automatic_scaling que se proporcionan por versión en el archivo de configuración.
|
Un servicio con escalado básico se configura definiendo el número máximo de instancias en el parámetro max_instances del ajuste basic_scaling . El número de instancias activas se ajusta
en función del volumen de procesamiento.
|
El número de instancias de cada versión se configura en el archivo de configuración de ese servicio. El número de instancias suele corresponderse con el tamaño de un conjunto de datos que se almacena en la memoria o con el rendimiento deseado para el trabajo offline. |
Escalar instancias dinámicas
Las aplicaciones de App Engine que usan el escalado básico o automático se basan en un número de instancias dinámicas en un momento dado, en función del volumen de solicitudes entrantes. A medida que aumenten las solicitudes de tu aplicación, también puede aumentar el número de instancias dinámicas.
Aplicaciones con escalado básico
Si usas el escalado básico, App Engine intentará mantener los costes bajos, aunque esto pueda provocar una latencia mayor a medida que aumente el volumen de solicitudes entrantes.
Cuando ninguna de las instancias disponibles puede atender una solicitud entrante, App Engine inicia una nueva instancia. Incluso después de iniciar una nueva instancia, es posible que algunas solicitudes deban ponerse en cola hasta que la nueva instancia complete su proceso de inicio. Si necesitas la latencia más baja posible, considera la opción de usar el escalado automático, que crea nuevas instancias de forma preventiva para minimizar la latencia.
Aplicaciones con escalado automático
Si utilizas el escalado automático, cada instancia de tu aplicación tiene su propia cola para las solicitudes entrantes. Antes de que las colas sean lo suficientemente largas como para que afecten de forma notable a la latencia de tu aplicación, App Engine crea automáticamente una o varias instancias nuevas para gestionar el aumento de la carga.
Puedes configurar los ajustes del escalado automático para conseguir un equilibrio entre el rendimiento que quieres y el coste que puedes asumir. En la tabla siguiente se describen estos ajustes.
Configuración del escalado automático | Descripción |
---|---|
Uso de CPU objetivo | Define el umbral de la relación de utilización de la CPU para especificar el umbral de uso de la CPU en el que se iniciarán más instancias para gestionar el tráfico. |
Uso de rendimiento objetivo | Define el umbral de rendimiento del número de solicitudes simultáneas a partir del cual se iniciarán más instancias para gestionar el tráfico. |
N.º máximo de solicitudes simultáneas | Define el número máximo de solicitudes simultáneas que puede aceptar una instancia antes de que el programador genere una nueva instancia. |
Consulta el vídeo Configuración del programador de App Engine para ver los efectos de estos ajustes.
Reducir
Cuando el volumen de solicitudes disminuye, App Engine reduce el número de instancias. Este ajuste a la baja ayuda a asegurar que todas las instancias actuales de tu aplicación se usen con una eficiencia y una rentabilidad óptimas.
Cuando una aplicación no se está usando, App Engine desactiva sus instancias dinámicas asociadas, pero las vuelve a cargar fácilmente en cuanto se necesitan. Si se vuelven a cargar las instancias, se pueden producir solicitudes de carga y una latencia adicional para los usuarios.
Puedes especificar un número mínimo de instancias inactivas. Si configuras un número adecuado de instancias inactivas para tu aplicación en función del volumen de solicitudes, tu aplicación podrá atender todas las solicitudes con poca latencia, a menos que experimentes un volumen de solicitudes anormalmente alto.
Reducción en el escalado automático
Si tu aplicación usa el escalado automático, las instancias inactivas tardarán unos 15 minutos en empezar a cerrarse. Para mantener en funcionamiento una o varias instancias inactivas, asigna a min_idle_instances
el valor 1
o uno superior.
Escalado y lotes de solicitudes
Si envías lotes de solicitudes a tus servicios (por ejemplo, a una cola de tareas para que se procesen), se creará un gran número de instancias rápidamente. Te recomendamos que controles este aspecto limitando el número de solicitudes enviadas 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 las instancias
Siempre se está ejecutando una instancia de un servicio con escalado automático. Sin embargo, una instancia de un servicio escalado de forma manual o básica puede estar en ejecución o detenida. Todas las instancias del mismo servicio y versión comparten el mismo estado. Para cambiar el estado de tus instancias, gestiona tus versiones. Puedes hacer lo siguiente:
- Usar la página Versiones de la Google Cloud consola
- Usar los comandos
gcloud app versions start
ygcloud app versions stop
- Usar el servicio Modules
Startup
Cada instancia de servicio se crea en 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 escalado manual y básico deben responder a la solicitud de inicio antes de poder gestionar otra solicitud. La solicitud de inicio se puede usar
con dos fines:
- Para iniciar un programa que se ejecute indefinidamente sin aceptar más solicitudes.
- Para inicializar una instancia antes de que reciba tráfico adicional.
Las instancias de escalado manual, básico y automático se inician de forma diferente. Cuando inicias una instancia de escalado manual, App Engine envía inmediatamente una solicitud /_ah/start
a cada instancia. Cuando inicias una instancia de un servicio de escalado básico, App Engine le permite aceptar tráfico, pero la solicitud /_ah/start
no se envía a una instancia hasta que recibe la primera solicitud de un usuario. Las instancias de escalado básico solo se inician cuando es necesario para gestionar el aumento del tráfico. Las instancias de escalado automático no reciben ninguna solicitud /_ah/start
.
Cuando una instancia responde a la solicitud /_ah/start
con un código de estado HTTP 200–299
o 404
, se considera que se ha iniciado correctamente y puede gestionar solicitudes adicionales. De lo contrario, App Engine finalizará la instancia. Las instancias de escalado manual se reinician inmediatamente, mientras que las de escalado básico solo se reinician cuando es necesario para atender el tráfico.
Apagar
El proceso de apagado puede activarse por diversos eventos planificados y no planificados, como los siguientes:
- Hay demasiadas instancias y no hay suficientes solicitudes de aplicaciones (tráfico).
- Detienes una instancia manualmente.
- Despliega una versión actualizada en el servicio.
- La instancia supera la memoria máxima de su
instance_class
configurado. - Tu aplicación se queda sin cuota de horas de instancia.
- Tu instancia se ha movido a otra máquina porque se ha reiniciado la máquina en la que se estaba ejecutando o porque App Engine ha movido tu instancia para mejorar la distribución de la carga.
Una de las ventajas de la plataforma "paga solo por lo que necesitas" del entorno estándar de App Engine, como se ha descrito anteriormente en la sección Reducción vertical, es que el sistema reduce automáticamente el número de instancias a cero cuando no hay tráfico. Esto hace que App Engine sea una solución rentable para aplicaciones pequeñas que no reciben solicitudes continuas. Cuando es necesario apagar una instancia, las nuevas solicitudes entrantes se dirigen a otras instancias (si las hay) y las solicitudes que se estén procesando tienen tiempo para completarse.
Cuando es necesario apagar una instancia, App Engine envía una señalKILL
(SIGKILL
) para terminar la instancia.
Cargando solicitudes
Cuando App Engine crea una instancia nueva para tu aplicación, esta debe cargar primero las bibliotecas y los recursos necesarios para gestionar la solicitud. Esto ocurre durante la primera solicitud a la instancia, denominada solicitud de carga. Durante una solicitud de carga, tu aplicación se inicializa, lo que provoca que la solicitud tarde más.
Las siguientes prácticas recomendadas le permiten reducir la duración de las solicitudes de carga:
- Carga únicamente el código necesario para el inicio.
- Accede al disco lo menos posible.
- En algunos casos, cargar código desde un archivo ZIP o JAR es más rápido que hacerlo desde muchos archivos independientes.
Solicitudes de preparación
Las solicitudes de calentamiento son un tipo específico de solicitudes de carga que cargan el código de la aplicación en una instancia con antelación, antes de que se hagan solicitudes activas.
Las instancias de escalado manual o básico no reciben una solicitud /_ah/warmup
.
Tiempo de funcionamiento de instancia
App Engine intenta mantener las instancias de escalado manual y básico en ejecución indefinidamente. Sin embargo, en este momento no se garantiza el tiempo de actividad de las instancias de escalado manual y básico. Los fallos de hardware y software que provocan la finalización anticipada o reinicios frecuentes pueden producirse sin previo aviso y pueden tardar bastante tiempo en resolverse. Por lo tanto, debes diseñar tu aplicación de forma que pueda tolerar estos fallos.
Estas son algunas estrategias eficaces para evitar el tiempo de inactividad debido a los reinicios de instancias:
- Reduce el tiempo que tardan en reiniciarse tus instancias o en iniciarse las nuevas.
- En el caso de los cálculos de larga duración, crea puntos de control periódicamente para poder reanudar el proceso desde ese estado.
- Tu aplicación debe ser "sin estado" para que no se almacene nada en la instancia.
- Usa colas para ejecutar tareas de forma asíncrona.
- Si configuras tus instancias para que se escalen manualmente, ten en cuenta lo siguiente:
- Usa el balanceo de carga en varias instancias.
- Configura más instancias de las necesarias para gestionar el tráfico normal.
- Escribe una lógica alternativa que use resultados almacenados en caché cuando no haya disponible una instancia de escalado manual.
NTP con el entorno estándar de App Engine
El entorno estándar de App Engine tiene servicios de protocolo de tiempo de red (NTP) que usan servidores NTP de Google. Sin embargo, el servicio NTP no se puede editar.