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 la scalabilità automatica delle istanze in base alla configurazione fornita dall'utente.
Nel runtime Java di App Engine, le richieste di preriscaldamento sono abilitate 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 tue esigenze. Puoi
rispondere alle richieste di preavviso utilizzando uno dei seguenti metodi:
- Utilizzo di una servlet
<load-on-startup> - Il modo più semplice per fornire la logica di pre-riscaldamento è contrassegnare le tue servlet come
<load-on-startup>nel file di configurazioneweb.xml. - Utilizzo di un
ServletContextListener - Ti consente di eseguire una logica personalizzata prima che venga richiamata una delle tue servlet tramite una richiesta di warmup o di caricamento.
- Utilizzo di una servlet di preriscaldamento personalizzata
- L'utilizzo di una servlet di preavvio personalizzata richiama il metodo
servicedella servlet solo durante una richiesta di warmup anziché durante le richieste di caricamento.
A seconda del metodo scelto, potrebbe essere necessario implementare un gestore personalizzato per /_ah/warmup.
Prima di iniziare
Quando le richieste di preavvio sono attive, lo scheduler avvia le istanze quando determina che sono necessarie più istanze. Lo scheduler utilizza le richieste di riscaldamento per avviare l'app, quindi vedrai i log anche se l'app non elabora queste richieste di riscaldamento.
Il seguente messaggio indica le richieste di preriscaldamento nei log /_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 è 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.
In Java 8, le richieste di preriscaldamento sono attive per impostazione predefinita. Per attivarli,
aggiungi - warmup alla
direttiva inbound_services
in appengine-web.xml. Poiché i
warmup sono attivati per impostazione predefinita, devi attivarli esplicitamente solo se hai
precedentemente eseguito il deployment di 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 una servlet <load-on-startup>
Il modo più semplice per fornire la logica di preriscaldamento è contrassegnare le tue servlet come
<load-on-startup> in web.xml. Questo metodo non richiede modifiche al codice dell'applicazione e inizializza tutte le servlet specificate quando l'applicazione viene inizializzata.
Nel file web.xml, per le servlet che vuoi caricare all'avvio,
aggiungi 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 richiamano il metodo init() della servlet. La richiesta di warmup inizializza le servlet specificate prima di gestire
qualsiasi richiesta live. Tuttavia, se non è presente alcuna richiesta di warmup, le servlet
specificate in <load-on-startup> vengono registrate alla prima richiesta a una nuova
istanza, il che comporta una richiesta di caricamento. Come indicato in precedenza, App Engine potrebbe
non inviare unarichiesta di warmupo ogni volta che l'applicazione ha bisogno di una nuova istanza.
Utilizzando un ServletContextListener
Se hai una logica personalizzata che vuoi eseguire prima che venga richiamata una delle tue servlet:
Registra un
ServletContextListenernel 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
preparazione, viene eseguita alla prima richiesta a una nuova istanza. Ciò potrebbe comportare
richieste di caricamento.
Utilizzo di una servlet di preriscaldamento personalizzata
La servlet di preriscaldamento personalizzata richiama il metodo service della servlet solo durante una
richiesta di warmupo. Se inserisci una logica costosa in una servlet di precaricamento personalizzata, puoi evitare tempi di caricamento più lunghi per le richieste di caricamento.
Per creare una servlet di preriscaldamento personalizzata, esegui l'override della definizione della servlet integrata
per _ah_warmup in web.xml:
<servlet>
<servlet-name>_ah_warmup</servlet-name>
<servlet-class>com.company.MyWarmupServlet</servlet-class>
</servlet>