Configurazione delle richieste di riscaldamento 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 dell'app in una nuova in esecuzione in un'istanza Compute Engine. 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.
  • Durante la manutenzione e le riparazioni dell'infrastruttura fisica o dell'infrastruttura sottostante, hardware.

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 in tempo reale 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 funzionano in ogni caso. Di conseguenza, potresti riscontrare richieste di caricamento, anche se le richieste di riscaldamento siano abilitate nella tua app. Ad esempio, se la tua app non pubblica di traffico, la prima richiesta all'app sarà sempre una richiesta di caricamento, non richiesta di warmup.

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 a un valore superiore a 0, potresti riscontrare richieste di riscaldamento quando queste istanze all'avvio, ma rimarranno disponibili dopo tale data.

La richiesta di warmup predefinita fa sì che tutti i file JAR vengano indicizzati in memoria e inizializza l'applicazione e i filtri.

Abilitazione delle richieste di riscaldamento in corso...

Le richieste di riscaldamento vengono utilizzate dallo scheduler 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 una logica di riscaldamento è contrassegnare i tuoi servlet come <load-on-startup> nel file di configurazione web.xml.
Utilizzare un ServletContextListener
Ti consente di eseguire una logica personalizzata prima che un servlet venga richiamato per la prima volta tramite una richiesta di warmup o di caricamento.
Utilizzare un servlet di riscaldamento personalizzato
L'utilizzo di un servlet di riscaldamento personalizzato richiama solo il metodo service del servlet durante una richiesta di warmup anziché durante una richiesta di caricamento.

Potrebbe essere necessario implementare il tuo gestore per /_ah/warmup, a seconda quale di questi metodi scegli.

Prima di iniziare

Quando le richieste di riscaldamento sono abilitate, lo scheduler avvia le istanze e determina la necessità di più istanze. Lo scheduler usa il riscaldamento di avviare la tua app; potrai quindi vedere i log anche se l'app non elabora per le richieste di riscaldamento.

Il seguente messaggio indica le richieste di riscaldamento 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 è garantito che le richieste di riscaldamento vengano chiamate. In alcuni casi vengono inviate richieste di caricamento: ad esempio, se l'istanza è la prima avviata o se si verifica un aumento significativo 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 attivate per impostazione predefinita. Per attivarle, aggiungi - warmup alla direttiva inbound_services in appengine-web.xml. Perché, per impostazione predefinita, i warmup sono abilitati, devi abilitarli esplicitamente solo se ha già eseguito il deployment di un'applicazione con le richieste di warmup disabilitate in appengine-web.xml. In questo caso, devi impostare il valore <warmup-requests-enabled> su true ed eseguire nuovamente il deployment.

Utilizzo di un servlet <load-on-startup>

Il modo più semplice per fornire una logica di riscaldamento è contrassegnare i tuoi servlet come <load-on-startup> a web.xml. Questo metodo non richiede modifiche il codice dell'applicazione e inizializza tutti i servlet specificati quando l'applicazione viene inizializzata.

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 richiamano il valore init() del servlet . La richiesta di warmup inizializza i servlet specificati prima della manutenzione a tutte le richieste in tempo reale. Tuttavia, se non c'è una richiesta di warmup, i servlet specificati in <load-on-startup> vengono registrati alla prima richiesta a un nuovo generando una richiesta di caricamento. Come indicato in precedenza, App Engine potrebbe non inviare una richiesta di preriscaldamento 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:

  1. Registrare una ServletContextListener nel file web.xml.

    <listener>
      <listener-class>com.company.MyListener</listener-class>
    </listener>
    
  2. 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 warmup personalizzato richiama il metodo service del servlet solo durante una richiesta di warmup. Inserendo una logica costosa in un servlet di riscaldamento personalizzato, puoi di evitare l'aumento dei tempi di caricamento delle richieste.

Per creare un servlet di riscaldamento personalizzato, basta sostituire il servlet integrato definizione di _ah_warmup in web.xml:

<servlet>
  <servlet-name>_ah_warmup</servlet-name>
  <servlet-class>com.company.MyWarmupServlet</servlet-class>
</servlet>