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 riscaldamento vengono utilizzate dal programmatore di App Engine, che controlla la scalabilità automatica delle istanze in base alla configurazione fornita dall'utente.
Nel runtime Java di App Engine, le richieste di riscaldamento sono attivate per impostazione predefinita, pertanto App Engine invia richieste GET
a /_ah/warmup
, il che ti consente di rispondere e inizializzare il codice dell'applicazione in base alle esigenze. Puoi rispondere alle richieste di riscaldamento utilizzando uno dei seguenti metodi:
- Utilizzare un servlet
<load-on-startup>
- Il modo più semplice per fornire la logica di riscaldamento è contrassegnare i tuoi servlet come
<load-on-startup>
nel file di configurazioneweb.xml
. - Utilizzare un
ServletContextListener
- Ti consente di eseguire la logica personalizzata prima dell'invocazione di uno dei tuoi servlet tramite una richiesta di warmup o una richiesta di caricamento.
- Utilizzare un servlet di preriscaldamento personalizzato
- L'utilizzo di un servlet di riscaldamento personalizzato invoca il metodo
service
del servlet solo durante una richiesta di warmup anziché durante le richieste di caricamento.
Potresti dover implementare il tuo gestore per /_ah/warmup
a seconda di quale di questi metodi scegli.
Prima di iniziare
Quando le richieste di preriscaldamento sono attivate, lo scheduler avvia le istanze quando determina che sono necessarie altre istanze. Il programmatore utilizza richieste di preriscaldamento per avviare l'app, quindi vedrai i log anche se l'app non le elabora.
Il seguente messaggio indica le richieste di riscaldamento nei log di /_ah/warmup
:
This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.
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.
In Java 8, le richieste di warmup sono abilitate per impostazione predefinita. Per attivarle,
aggiungi - warmup
alla
direttiva inbound_services
in appengine-web.xml
. Poiché per impostazione predefinita i warmup sono attivati, devi attivarli esplicitamente solo se hai precedentemente disegnato un'applicazione con le richieste di warmup disattivate in appengine-web.xml
.
In questo caso, devi impostare il valore <warmup-requests-enabled>
su
true
e poi eseguire nuovamente il deployment.
Utilizzo di un servlet <load-on-startup>
Il modo più semplice per fornire la logica di riscaldamento è contrassegnare i tuoi servlet come
<load-on-startup>
in web.xml
. Questo metodo non richiede modifiche al codice dell'applicazione e inizializza tutti i servlet specificati all'inizializzazione dell'applicazione.
Nel file web.xml
, per i servlet che vuoi caricare all'avvio,
aggiungere l'elemento <load-on-startup>1</load-on-startup>
all'elemento <servlet>
. Ad esempio:
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>com.company.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Queste righe caricano la classe servlet specificata e invocano il metodo init()
del servlet. La richiesta di warmup inizializza i servlet specificati prima di gestire qualsiasi richiesta in tempo reale. Tuttavia, se non è presente una richiesta di warmup, i servlet
specificati in <load-on-startup>
vengono registrati alla prima richiesta a una nuova
istanza, il che genera una richiesta di caricamento. Come indicato in precedenza, App Engine potrebbe
non inviare una richiesta di warmup ogni volta che la tua applicazione ha bisogno di una nuova istanza.
Utilizzo di un ServletContextListener
Se hai una logica personalizzata che vuoi eseguire prima dell'invocazione di uno dei tuoi servlet:
Registra un
ServletContextListener
nel fileweb.xml
.<listener> <listener-class>com.company.MyListener</listener-class> </listener>
Fornisci una classe insieme al codice del servlet e del filtro:
public class MyListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { // This will be invoked as part of a warmup request, or // the first user request if no warmup request was invoked. } public void contextDestroyed(ServletContextEvent event) { // App Engine does not currently invoke this method. } }
ServletContextListener
viene eseguito durante una richiesta di warmup. Se non è presente alcuna richiesta di preriscaldamento, viene eseguita alla prima richiesta a una nuova istanza. Ciò potrebbe comportare richieste di caricamento.
Utilizzo di un servlet di riscaldamento personalizzato
Il servlet di preriscaldamento personalizzato invoca il metodo service
del servlet solo durante una richiesta di warmup. Inserendo la logica dispendiosa in un servlet di preriscaldamento personalizzato, puoi evitare un aumento dei tempi di caricamento delle richieste di caricamento.
Per creare un servlet di riscaldamento personalizzato, basta sostituire la definizione del servlet integrato per _ah_warmup
in web.xml
:
<servlet>
<servlet-name>_ah_warmup</servlet-name>
<servlet-class>com.company.MyWarmupServlet</servlet-class>
</servlet>