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 il redeployment di una versione dell'app.
  • Quando vengono create nuove istanze a causa del carico delle richieste la capacità del set attuale di istanze in esecuzione.
  • Durante la manutenzione e le riparazioni dell'infrastruttura fisica o dell'infrastruttura sottostante, hardware.

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

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 nella tua app sono attivate le richieste di riscaldamento. Ad esempio, se la tua app non genera traffico, la prima richiesta all'app sarà sempre una richiesta di caricamento, non una richiesta di riscaldamento.

Le richieste di riscaldamento utilizzano le ore di istanza come qualsiasi altra richiesta al tuo nell'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. Il tuo l'utilizzo delle ore di istanza può aumentare se decidi di eseguire altre attività, ad esempio 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 al primo avvio di queste istanze, ma rimarranno disponibili dopo questo momento.

Abilitazione delle richieste di riscaldamento in corso...

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

Lo scheduler avvia le istanze quando determina che sono presenti più istanze necessaria. Le richieste di riscaldamento potrebbero essere visualizzate nei log anche se sono disattivate perché lo scheduler le utilizza per avviare le istanze.

Tieni presente che non è garantito che le richieste di riscaldamento vengano chiamate. In alcune situazioni vengono inviate richieste di caricamento, ad esempio se l'istanza è la prima l'avvio o la ripida salita nel 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

Registrazione del gestore

Puoi registrare lo script che gestisce le richieste di riscaldamento 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 riscaldamento al 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 deve eseguire qualsiasi logica di riscaldamento necessaria all'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

Potrebbe essere opportuno archiviare i valori in un datastore in memoria, Memcache, che offre alla tua app un accesso rapido ai dati senza query.

Ad esempio, se crei e archivi un elenco degli attuali articoli di tendenza per il tuo sito, puoi creare questo elenco nel warmup e memorizzarlo in Memcache. Quando viene inviata una richiesta da parte dell'utente, App Engine non deve eseguire query sul datastore e l'applicazione può soddisfare la richiesta dell'utente più rapidamente.