Configurazione delle richieste di warmup per migliorare le prestazioni

Puoi utilizzare le richieste di preavvio 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 perché il carico delle richieste supera la capacità del set corrente di istanze in esecuzione.
  • Quando si verificano la manutenzione e le riparazioni dell'infrastruttura sottostante o dell'hardware fisico.

Il caricamento del codice dell'app in una nuova istanza può comportare richieste di caricamento. Le richieste di caricamento possono comportare un aumento della latenza delle richieste per gli utenti, ma puoi evitare questa latenza utilizzando le richieste di preriscaldamento. Le richieste di preriscaldamento caricano il codice dell'app in una nuova istanza prima che le richieste live raggiungano l'istanza.

Se le richieste di preavvio sono attivate per la tua applicazione, App Engine tenta di rilevare quando l'applicazione ha bisogno di una nuova istanza e avvia una richiesta di preavvio per inizializzare una nuova istanza. Tuttavia, questi tentativi di rilevamento non funzionano in tutti i casi. Di conseguenza, potresti riscontrare richieste di caricamento, anche se le richieste di preriscaldamento sono abilitate nella tua app. Ad esempio, se la tua app non genera traffico, la prima richiesta all'app sarà sempre una richiesta di caricamento, non una richiesta di warmup.

Le richieste di preriscaldamento utilizzano le ore di istanza come qualsiasi altra richiesta alla tua applicazione App Engine. Nella maggior parte dei casi in cui le richieste di preavvio sono abilitate, non noterai un aumento delle ore di istanza perché la tua applicazione si inizializza semplicemente in una richiesta di warmupio anziché in una richiesta di caricamento. L'utilizzo delle ore di istanza può aumentare se decidi di svolgere più lavoro, ad esempio la pre-memorizzazione nella cache durante una richiesta di warmup. Se imposti min_idle_instances su un valore maggiore di 0, potresti riscontrare richieste di warmup all'avvio iniziale di queste istanze, ma rimarranno disponibili dopo quel periodo di tempo.

Attivazione delle richieste di warmup

Le richieste di preriscaldamento vengono utilizzate dallo scheduler App Engine, che controlla lo scaling automatico delle istanze in base alla configurazione fornita dall'utente. Con le richieste di preriscaldamento abilitate, App Engine invia GET richieste a /_ah/warmup. Puoi implementare i 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 necessarie più istanze. Le richieste di preriscaldamento potrebbero essere visualizzate nei log anche se sono disattivate, perché lo scheduler le utilizza per avviare le istanze.

Tieni presente che non è garantita la chiamata delle richieste di precaricamento. In alcune situazioni vengono inviate richieste di caricamento: ad esempio, se l'istanza è la prima a essere avviata o se si verifica un forte aumento del traffico. Tuttavia, se le richieste di warmup sono abilitate, verrà effettuato un tentativo "best effort" di inviare richieste alle istanze già sottoposte a warmup.

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

inbound_services:
- warmup

Registrazione del gestore

Puoi registrare lo script che gestisce le richieste di preavvio nel file app.yaml del progetto. Ad esempio:

inbound_services:
- warmup

handlers:
- url: /_ah/warmup
  script: main.py
  login: admin

Questo esempio registra un gestore per ascoltare le richieste di preriscaldamento nel percorso della richiesta /_ah/warmup con il file main.py.

Creazione del gestore

Crea un gestore che elabori le richieste inviate a /_ah/warmup. Il gestore deve eseguire qualsiasi logica di preparazione necessaria per l'app. L'esempio seguente si basa su quello precedente:

import webapp2

class MyWarmUpCode(webapp2.RequestHandler):
  """
  This class handles the warmup request. You should add any code that you
  need to execute in the `get` method, such as populating caches, and ensure
  that you return a successful HTTP response.
  """

  def get(self):

      # Your warmup logic goes here.

      # Return a successful response to indicate the logic completed.
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.write('Warmup successful')

  # ...

application = webapp2.WSGIApplication(
    [
        ('/_ah/warmup', MyWarmUpCode),
        # Other handlers
        # ...
    ]
)

Passaggi successivi

Potresti voler archiviare i valori in un datastore in memoria come Memcache, in modo che la tua app possa accedere ai dati in modo rapido e senza query.

Ad esempio, se crei e memorizzi un elenco degli articoli di tendenza attuali per il tuo sito, puoi creare l'elenco nel periodo di riscaldamento e memorizzarlo in Memcache. Quando arriva una richiesta utente, App Engine non deve eseguire query datastore e l'applicazione può soddisfare più rapidamente la richiesta dell'utente.