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 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 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 evitarla utilizzando le richieste di acclimatamento. Le richieste di riscaldamento caricano il codice dell'app in una nuova istanza prima che le richieste attive raggiungano l'istanza.
Se le richieste di preriscaldamento 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 preriscaldamento per inizializzarla. Tuttavia, questi tentativi di rilevamento non funzionano in tutti i casi. 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 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 warmup 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 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.
Attivazione delle richieste di warmup
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
. Puoi implementare gestori per questa richiesta per eseguire attività specifiche dell'applicazione, come la pre-cache dei dati dell'applicazione.
Il programmatore avvia le istanze quando stabilisce che sono necessarie altre istanze. 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 alcuni casi vengono inviate richieste di caricamento: ad esempio, se l'istanza è la prima che viene 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
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 elabori le richieste inviate a /_ah/warmup
.
L'handler deve eseguire qualsiasi logica di riscaldamento necessaria per l'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 memorizzare i valori in un datastore in memoria come Memcache, in modo da consentire alla tua app di accedere rapidamente ai dati senza eseguire query.
Ad esempio, se crei e memorizzi un elenco degli articoli di tendenza attuali per il tuo sito, puoi creare l'elenco durante il riscaldamento 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.