Configurazione delle richieste di warmup per migliorare le prestazioni

Puoi utilizzare le richieste di riscaldamento per ridurre la latenza di richieste e risposte durante il caricamento del codice dell'app in un'istanza appena creata.

App Engine deve spesso caricare il codice della tua app in una nuova istanza. Il caricamento di un'istanza può avvenire nelle seguenti situazioni:

  • Quando esegui nuovamente il deployment di una versione dell'app.
  • Quando vengono create nuove istanze a causa del carico delle richieste che supera la capacità dell'attuale insieme di istanze in esecuzione.
  • Quando si verificano operazioni di manutenzione e riparazione dell'infrastruttura di base o dell'hardware fisico.

Il caricamento del codice della tua app in una nuova istanza può comportare il caricamento richieste. Le richieste di caricamento possono comportare un aumento della latenza delle richieste per gli utenti, ma puoi evitarla utilizzando le richieste di acclimatamento. Le richieste di riscaldamento caricano il codice dell'app in una nuova istanza prima che le richieste in tempo reale raggiungano l'istanza.

Se le richieste di warmup sono abilitate per la tua applicazione, App Engine tenta di per rilevare quando la tua applicazione ha bisogno di una nuova istanza e avvia un warmup per inizializzare una nuova istanza. Tuttavia, questi tentativi di rilevamento funzionano in ogni caso. Di conseguenza, potresti riscontrare richieste di caricamento, anche se le richieste di riscaldamento siano abilitate nella tua app. Ad esempio, se la tua app non pubblica di traffico, la prima richiesta all'app sarà sempre una richiesta di caricamento, non richiesta di warmup.

Le richieste di preriscaldamento utilizzano le ore di istanza come qualsiasi altra richiesta all'applicazione App Engine. Nella maggior parte dei casi in cui le richieste di riscaldamento sono attivate, non noterai un aumento delle ore di istanza perché la tua applicazione viene semplicemente inizializzata in una richiesta di riscaldamento anziché in una richiesta di caricamento. L'utilizzo in ore dell'istanza può aumentare se decidi di eseguire più operazioni, ad esempio la pre-cache durante una richiesta di riscaldamento. Se imposti min_idle_instances a un valore superiore a 0, potresti riscontrare richieste di riscaldamento quando queste istanze all'avvio, ma rimarranno disponibili dopo tale data.

Abilitazione delle richieste di riscaldamento in corso...

Le richieste di preriscaldamento vengono utilizzate dal programmatore di App Engine, che controlla la scalabilità automatica delle istanze in base alla configurazione fornita dall'utente. Con le richieste di preriscaldamento attivate, App Engine invia richieste GET a /_ah/warmup. Tu può implementare gestori per questa richiesta per eseguire attività specifiche dell'applicazione, come la pre-memorizzazione nella cache dei dati dell'applicazione.

Lo scheduler avvia le istanze quando determina che sono presenti più istanze necessaria. Le richieste di riscaldamento possono essere visualizzate in log anche se sono disabilitate perché lo scheduler le usa per avviare le istanze.

Tieni presente che non è garantito che le richieste di riscaldamento vengano chiamate. In alcuni casi vengono inviate richieste di caricamento: ad esempio, se l'istanza è la prima avviata o se si verifica un aumento brusco del traffico. Tuttavia, se le richieste di warmup sono abilitate, verrà eseguito un tentativo "best effort" per inviare richieste a istanze già sottoposte a warmup.

Per attivare le richieste di riscaldamento, aggiungi l'elemento warmup sotto la direttiva inbound_services nel file app.yaml, ad esempio:

inbound_services:
- warmup

Creazione del gestore

Crea un gestore che elabori le richieste inviate a /_ah/warmup. L'handler deve eseguire qualsiasi logica di riscaldamento necessaria per l'app.

Ad esempio, se utilizzi Flask, il gestore potrebbe avere il seguente aspetto:

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)