Configura solicitudes de preparación para mejorar el rendimiento

Puedes usar solicitudes de preparación para reducir la latencia de las respuestas y solicitudes cuando se carga el código de tu app en una instancia recién creada.

Con frecuencia, App Engine necesita cargar el código de tu app en una instancia nueva. La carga de una instancia puede suceder en las siguientes situaciones:

  • Cuando vuelves a implementar una versión de tu app.
  • Cuando se crean nuevas instancias debido a que la carga de solicitudes supera la capacidad del conjunto actual de instancias en ejecución.
  • Cuando se realizan reparaciones y mantenimiento de la infraestructura subyacente o del hardware físico.

Cuando cargas el código de tu app en una instancia nueva, pueden generarse solicitudes de carga. Las solicitudes de carga pueden provocar una mayor latencia de solicitudes para los usuarios. Puedes evitarla si usas solicitudes de preparación. que cargan el código de tu app en una instancia nueva antes de que le lleguen solicitudes reales.

Si habilitaste las solicitudes de preparación en tu aplicación, App Engine intenta detectar cuándo esta necesita una instancia nueva y envía una solicitud de preparación para inicializarla. Sin embargo, estos intentos de detección no funcionan en todos los casos. Como resultado, es posible que encuentres solicitudes de carga, incluso si las solicitudes de preparación están habilitadas en tu app. Por ejemplo, cuando tu app no entrega tráfico, la primera solicitud siempre será de carga, no de preparación.

Las solicitudes de preparación usan horas de instancia como cualquier otra solicitud para tu aplicación de App Engine. En la mayoría de los casos en los que se habilitan las solicitudes de preparación, no se observa un aumento en las horas de instancia porque la aplicación se inicializa con una solicitud de preparación en lugar de una de carga. Tu uso de horas de instancia puede aumentar si decides hacer más trabajo, como almacenar datos en caché de forma previa durante una solicitud de preparación. Si configuras min_idle_instances como un valor mayor que 0, es posible que se generen solicitudes de preparación cuando esas instancias se inicien por primera vez, pero seguirán disponibles después de ese momento.

Habilita las solicitudes de preparación

El programador de App Engine, que controla el ajuste de escala automático de las instancias según la configuración que proporciona el usuario, usa las solicitudes de preparación. Cuando las solicitudes de preparación están habilitadas, App Engine envía solicitudes GET a /_ah/warmup. Puedes implementar controladores para esta solicitud a fin de que realicen tareas específicas de una aplicación, como almacenar sus datos en caché de forma previa.

Cuando se determina que hacen falta más instancias, el programador las inicia. Las solicitudes de preparación pueden aparecer en los registros incluso si están inhabilitadas, porque el programador las usa para iniciar instancias.

Ten en cuenta que no hay garantía de que se llame a las solicitudes de preparación. En algunas situaciones, se envían solicitudes de carga en su lugar (por ejemplo, si es la primera instancia que se inicia o si el tráfico aumenta de manera repentina). Sin embargo, si las solicitudes de preparación están habilitadas, el sistema hará todo lo posible para enviarlas a instancias que ya estén preparadas.

Para habilitar las solicitudes de preparación, agrega el elemento warmup en la directiva inbound_services del archivo app.yaml, como se muestra en el siguiente ejemplo:

inbound_services:
- warmup

Crea tu controlador

Crea un controlador que procese las solicitudes que se envían a /_ah/warmup. Tu controlador debe realizar cualquier lógica de preparación que necesite tu app.

Por ejemplo, si usas Flask, tu controlador podría verse de la siguiente manera:

from flask import Flask


app = Flask(__name__)


@app.route("/")
def main():
    """Serves a predefined placeholder string.

    Returns:
        A predefined string saying 'Hello World!'
    """
    return "Hello World!"


@app.route("/_ah/warmup")
def warmup():
    """Served stub function returning no content.

    Your warmup logic can be implemented here (e.g. set up a database connection pool)

    Returns:
        An empty string, an HTTP code 200, and an empty object.
    """
    return "", 200, {}


if __name__ == "__main__":
    # This is used when running locally only. When deploying to Google App
    # Engine, a webserver process such as Gunicorn will serve the app. This
    # can be configured by adding an `entrypoint` to app.yaml.
    app.run(host="127.0.0.1", port=8080, debug=True)