Configurare le richieste di warmup per migliorare le prestazioni

Puoi utilizzare le richieste di warmup 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 dell'app in una nuova istanza. Il caricamento di un'istanza può verificarsi nelle seguenti situazioni:

  • Quando riesegui il deployment di una versione della tua app.
  • Quando vengono create nuove istanze a causa del carico delle richieste che supera la capacità del set attuale di istanze in esecuzione.
  • Quando si verificano interventi di manutenzione e riparazione dell'infrastruttura sottostante o dell'hardware fisico.

Il caricamento del codice della tua app in una nuova istanza può comportare il caricamento delle richieste. Le richieste di caricamento possono comportare una maggiore latenza delle richieste per i tuoi utenti, ma puoi evitare questa latenza utilizzando le richieste di preparazione. Le richieste di warmup caricano il codice della tua app in una nuova istanza prima che eventuali richieste in tempo reale raggiungano l'istanza.

Se le richieste di warmup sono abilitate per la tua applicazione, App Engine tenta di rilevare quando l'applicazione ha bisogno di una nuova istanza e avvia una richiesta di warmup per inizializzare una nuova istanza. Tuttavia, questi tentativi di rilevamento non funzionano sempre. Di conseguenza, potresti riscontrare richieste di caricamento, anche se nella tua app sono abilitate richieste di preparazione. 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 warmup utilizzano le ore di istanza come qualsiasi altra richiesta all'applicazione App Engine. Nella maggior parte dei casi in cui le richieste di warmup sono abilitate, non noterai un aumento delle ore di istanza perché l'applicazione viene semplicemente inizializzata in una richiesta di warmup anziché in una richiesta di caricamento. L'utilizzo dell'ora di istanza può aumentare se decidi di svolgere più attività, ad esempio la pre-memorizzazione nella cache durante una richiesta di warmup. Se imposti min_idle_instances su un valore superiore a 0, potresti riscontrare richieste di warmup al primo avvio di queste istanze, ma rimarranno disponibili dopo questo periodo.

Abilitazione delle richieste di warmup

Le richieste di warmup vengono utilizzate dallo scheduler di App Engine, che controlla la scalabilità automatica delle istanze in base alla configurazione fornita dall'utente. Con le richieste di warmup abilitate, App Engine invia richieste GET a /_ah/warmup. Puoi implementare gestori per questa richiesta per eseguire attività specifiche dell'applicazione, ad esempio la memorizzazione preliminare nella cache dei dati dell'applicazione.

Lo scheduler avvia le istanze quando determina che sono necessarie più istanze. Le richieste di warmup possono essere visualizzate nei log anche se sono disabilitate perché lo scheduler le utilizza per avviare le istanze.

Tieni presente che non è garantito che le richieste di warmup vengano chiamate. In alcune situazioni vengono invece inviate le richieste di caricamento, ad esempio se l'istanza è la prima avviata o se il traffico è in forte aumento. Tuttavia, ci sarà un tentativo "best effort" di inviare richieste a istanze già sottoposte a warmup se le richieste di warmup sono abilitate.

Per abilitare le richieste di warmup, aggiungi l'elemento warmup sotto l'istruzione inbound_services nel file app.yaml, ad esempio:

inbound_services:
- warmup

Registrazione del gestore

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

inbound_services:
- warmup

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

In questo esempio viene registrato un gestore per l'ascolto delle richieste di warmup nel percorso della richiesta /_ah/warmup con il file main.py.

Creazione del gestore

Crea un gestore che elaborerà le richieste inviate a /_ah/warmup. Il gestore dovrebbe eseguire qualsiasi logica di warmup richiesta dalla tua app. L'esempio seguente si basa sull'esempio 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, per dare alla tua app un accesso rapido ai dati senza query.

Ad esempio, se crei e archivi un elenco degli articoli di tendenza attuali per il tuo sito, puoi creare questo elenco nel warmup e archiviarlo in Memcache. Quando arriva una richiesta dell'utente, App Engine non ha bisogno di eseguire query sul datastore e l'applicazione può soddisfare la richiesta dell'utente più velocemente.