Le istanze sono i componenti di base di App Engine e forniscono tutte le risorse necessarie per ospitare correttamente la tua applicazione. In qualsiasi momento, la tua applicazione può essere in esecuzione su una o più istanze con le richieste distribuite su tutte. Ogni istanza include un livello di sicurezza per garantire che le istanze non possano influire inavvertitamente l'una sull'altra.
App Engine può creare e arrestare automaticamente le istanze in base alle fluttuazioni del traffico oppure puoi specificare un numero di istanze da eseguire indipendentemente dall'entità del traffico. Per determinare come e quando vengono create le nuove istanze, specifica un tipo di scalabilità per l'app. Le impostazioni di scalabilità vengono applicate al livello della versione di App Engine nell'ambito del file app.yaml.
Tipi di scalabilità
App Engine supporta i seguenti tipi di scalabilità, che controllano come e quando vengono create le istanze:
- Automatica (impostazione predefinita)
- Di base
- Manuale
Specifica il tipo di scalabilità nel file appengine-web.xml
dell'app.
Per impostazione predefinita, l'app utilizza la scalabilità automatica, il che significa che App Engine gestirà il numero di istanze inattive.
- Scalabilità automatica
- La scalabilità automatica crea istanze in base al tasso di richieste, alle latenze di risposta e ad altre metriche dell'applicazione. Puoi specificare soglie per ciascuna di queste metriche, nonché un numero minimo di istanze da mantenere in esecuzione in ogni momento, configurando l'elemento
automatic_scaling
.
- Scalabilità di base
- La scalabilità di base crea istanze quando l'applicazione riceve richieste. Ogni istanza verrà arrestata quando l'applicazione diventa inattiva. La scalabilità di base è ideale per il lavoro intermittente o basato sull'attività utente.
- Scalabilità manuale
- La scalabilità manuale specifica il numero di istanze in esecuzione continua indipendentemente dal livello di carico. Ciò consente attività come inizializzazioni complesse e applicazioni che si basano sullo stato della memoria nel tempo.
Funzionalità | Scalabilità automatica | Scalabilità di base | Scalabilità manuale |
---|---|---|---|
Timeout della richiesta |
10 minuti per le richieste HTTP e le attività coda di attività. Se la tua app non
restituisce una richiesta entro questo limite di tempo, App Engine interrompe
il gestore delle richieste e
genera
un errore da gestire dal codice.
Per i runtime legacy (Java 8, PHP 5 e Python 2):
|
24 ore per le richieste HTTP e le attività della coda di attività. Se la tua app non
restituisce una richiesta entro questo limite di tempo, App Engine interrompe il
gestore delle richieste e
genera
un errore da gestire dal codice.
Un'istanza con scalabilità di base può scegliere di gestire |
Uguale alla scalabilità di base. |
Thread in background | Non consentito | Consentito | Consentito |
Residenza | Le istanze vengono chiuse in base ai pattern di utilizzo. |
Le istanze vengono arrestate in base al parametro idle-timeout . Se un'istanza è inattiva, ad esempio non ha ricevuto
una richiesta per più di idle-timeout , viene chiusa.
|
Le istanze rimangono in memoria e lo stato viene mantenuto tra le richieste. Quando
le istanze vengono interrotte, nei log viene visualizzata una richiesta /_ah/stop .
Se è presente un gestore /_ah/stop o un hook di arresto registrato, ha 30 secondi di tempo per completare il processo prima dell'arresto.
|
Avvio e arresto | Le istanze vengono create su richiesta per gestire le richieste e vengono ridotte automaticamente quando sono inattive. |
Le istanze vengono create su richiesta per gestire le richieste e si arrestano automaticamente quando sono inattive, in base al parametro di configurazione idle-timeout . Un'istanza interrotta manualmente ha 30 secondi di tempo per completare la gestione delle richieste prima di essere terminata forzatamente.
|
App Engine invia automaticamente alle istanze una richiesta di avvio sotto forma di richiesta GET vuota a /_ah/start . Come per la scalabilità di base, un'istanza interrotta manualmente ha 30 secondi di tempo per completare la gestione delle richieste prima di essere terminata forzatamente.
|
Indirizzabilità delle istanze | Le istanze sono anonime. |
L'istanza "i" della versione "v" del servizio "s" è indirizzabile all'URL:
https://i-dot-v-dot-s-dot-app_id.REGION_ID.r.appspot.com .
Se hai configurato una
mappatura dei sottodomini con caratteri jolly per un dominio personalizzato, puoi anche indirizzare
un servizio o una delle sue istanze tramite un URL del tipo
https://s.domain.com o https://i.s.domain.com .
Puoi memorizzare in modo affidabile lo stato in ogni istanza e recuperarlo nelle richieste successive.
|
Uguale alla scalabilità di base. |
Scalabilità |
App Engine scala automaticamente il numero di istanze in risposta al volume di elaborazione. Questo fattore di scala tiene conto delle impostazioni automatic_scaling fornite su base di versione nel file di configurazione.
|
Un servizio con scalabilità di base viene configurato impostando il numero massimo di istanze nel parametro max_instances dell'impostazione basic_scaling . Il numero di istanze attive varia in base al volume di elaborazione.
|
Configura il numero di istanze di ogni versione nel file di configurazione del servizio. In genere, il numero di istanze corrisponde alle dimensioni di un set di dati memorizzato in memoria o alla velocità effettiva desiderata per il lavoro offline. |
Scalabilità delle istanze dinamiche
Le applicazioni App Engine che utilizzano la scalabilità di base o automatica sono supportate da un numero qualsiasi di istanze dinamiche in un determinato momento, a seconda del volume delle richieste in entrata. Con l'aumento delle richieste per la tua applicazione, potrebbe aumentare anche il numero di istanze dinamiche.
App con scalabilità di base
Se utilizzi la scalabilità di base, App Engine tenta di mantenere basso il costo, anche se ciò potrebbe comportare una latenza più elevata con l'aumento del volume delle richieste in entrata.
Quando nessuna delle istanze esistenti è disponibile per soddisfare una richiesta in arrivo, App Engine avvia una nuova istanza. Anche dopo l'avvio di una nuova istanza, potrebbe essere necessario mettere in coda alcune richieste finché la nuova istanza non completa la procedura di avvio. Se hai bisogno della latenza più bassa possibile, ti consigliamo di utilizzare la scalabilità automatica, che crea nuove istanze in modo preventivo per ridurre al minimo la latenza.
App con scalabilità automatica
Se utilizzi la scalabilità automatica, ogni istanza della tua app ha la propria coda per le richieste in arrivo. Prima che le code diventino abbastanza lunghe da avere un effetto significativo sulla latenza della tua app, App Engine crea automaticamente una o più nuove istanze per gestire il carico crescente.
Puoi configurare le impostazioni per la scalabilità automatica in modo da trovare un compromesso tra le prestazioni che vuoi e i costi che puoi sostenere. La tabella seguente descrive queste impostazioni.
Impostazioni di scalabilità automatica | Descrizione |
---|---|
Utilizzo CPU target | Imposta la soglia del rapporto di utilizzo della CPU per specificare la soglia di utilizzo della CPU a cui verranno avviate altre istanze per gestire il traffico. |
Utilizzo velocità effettiva target | Imposta la soglia di throughput per il numero di richieste in parallelo dopo le quali verranno avviate altre istanze per gestire il traffico. |
Numero max richieste in parallelo | Imposta il numero massimo di richieste in parallelo che un'istanza può accettare prima che lo scheduler generi una nuova istanza. |
Guarda il video Impostazioni programmatore di App Engine per vedere gli effetti di queste impostazioni.
Riduzione
Quando i volumi di richieste diminuiscono, App Engine riduce il numero di istanze. Questo ridimensionamento verso il basso contribuisce a garantire che tutte le istanze attuali dell'applicazione vengano utilizzate in modo ottimale in termini di efficienza ed economicità.
Quando un'applicazione non è in uso, App Engine disattiva le sue istanze dinamiche associate, ma le ricarica immediatamente non appena sono necessarie. Il ricaricamento delle istanze può comportare richieste di caricamento e latenza aggiuntiva per gli utenti.
Puoi specificare un numero minimo di istanze inattive. L'impostazione di un numero appropriato di istanze inattive per l'applicazione in base al volume delle richieste consente all'applicazione di soddisfare ogni richiesta con poca latenza, a meno che non si verifichi un volume di richieste anormalmente elevato.
Scale down nella scalabilità automatica
Se la tua app utilizza la scalabilità automatica, sono necessari circa 15 minuti di inattività per avviare l'arresto delle istanze inattive. Per mantenere in esecuzione una o più istanze inattive, imposta il valore di min_idle_instances
su 1
o superiore.
Scalabilità e batch di richieste
Se invii batch di richieste ai tuoi servizi, ad esempio a una coda di attività per l'elaborazione, verrà creato rapidamente un numero elevato di istanze. Ti consigliamo di controllarlo limitazione di frequenza il numero di richieste inviate al secondo, se possibile. Ad esempio, se utilizzi Google Tasks, puoi controllare la frequenza con cui le attività vengono inviate.
Ciclo di vita di un'istanza
Stati delle istanze
Un'istanza di un servizio con scalabilità automatica è sempre in esecuzione. Tuttavia, un'istanza di un servizio con scalabilità manuale o di base può essere in esecuzione o interrotta. Tutte le istanze dello stesso servizio e della stessa versione condividono lo stesso stato. Puoi modificare lo stato delle tue istanze gestendo le versioni. Puoi:
- Utilizzare la pagina Versioni nella console Google Cloud
- Utilizza i comandi
gcloud app versions start
egcloud app versions stop
- Utilizzare il servizio Moduli
Avvio
Ogni istanza di servizio viene creata in risposta a una richiesta di avvio, ovvero una richiesta GET
HTTP vuota a /_ah/start
. App Engine invia questa richiesta per creare un'istanza. Gli utenti non possono inviare una richiesta a /_ah/start
. Le istanze di scalabilità manuale e di base devono rispondere alla richiesta di inizio prima di poter gestire un'altra richiesta. La richiesta di avvio può essere utilizzata per due scopi:
- Per avviare un programma che viene eseguito a tempo indeterminato, senza accettare ulteriori richieste.
- Per inizializzare un'istanza prima che riceva traffico aggiuntivo.
Le istanze con scalabilità manuale, di base e automatica vengono avviate in modo diverso. Quando inizi un'istanza con il ridimensionamento manuale, App Engine invia immediatamente una richiesta /_ah/start
a ogni istanza. Quando avvii un'istanza di un servizio di scalabilità di base, App Engine consente di accettare il traffico, ma la richiesta /_ah/start
non viene inviata a un'istanza finché non riceve la prima richiesta dell'utente. Vengono avviate più istanze di scalabilità di base solo se necessario per gestire l'aumento del traffico. Le istanze con scalabilità automatica non ricevono alcuna richiesta /_ah/start
.
Quando un'istanza risponde alla richiesta /_ah/start
con un codice di stato HTTP 200–299
o 404
, si considera che sia stata avviata correttamente e può gestire richieste aggiuntive. In caso contrario, App Engine termina l'istanza. Le istanze con scalabilità manuale vengono riavviate immediatamente, mentre quelle con scalabilità di base vengono riavviate solo quando necessario per gestire il traffico.
Arresto
Il processo di arresto potrebbe essere attivato da una serie di eventi pianificati e non pianificati, ad esempio:
- Esistono troppe istanze e non sono presenti richieste di app sufficienti (traffico).
- Arresti manualmente un'istanza.
- Esegui il deployment di una versione aggiornata nel servizio.
- L'istanza supera la memoria massima per il
instance_class
configurato. - La quota di ore di istanze dell'applicazione è esaurita.
- L'istanza viene spostata su un'altra macchina perché la macchina corrente su cui è in esecuzione l'istanza è stata riavviata o perché App Engine ha spostato l'istanza per migliorare la distribuzione del carico.
Uno dei vantaggi della piattaforma "paghi solo per ciò che ti serve" dell'ambiente standard di App Engine, come descritto in precedenza in Scalabilità ridotta, è che il sistema riduce automaticamente il numero di istanze a zero quando non c'è traffico. In questo modo, App Engine diventa una soluzione economica per le piccole applicazioni che non ricevono richieste continue. Quando un'istanza deve essere arrestata, le nuove richieste in entrata vengono inoltrate ad altre istanze (se presenti) e alle richieste in fase di elaborazione viene concesso il tempo di completarsi.
Quando è necessario arrestare un'istanza, App Engine invia un segnaleKILL
(SIGKILL
) che ne termina l'esecuzione.
Caricamento delle richieste
Quando App Engine crea una nuova istanza per la tua applicazione, l'istanza deve prima caricare le librerie e le risorse necessarie per gestire la richiesta. Questo accade durante la prima richiesta all'istanza, chiamata Richiesta di caricamento. Durante una richiesta di caricamento, l'applicazione viene inizializzata, il che prolunga la richiesta.
Le seguenti best practice ti consentono di ridurre la durata delle richieste di caricamento:
- Carica solo il codice necessario per l'avvio.
- Accedi al disco il meno possibile.
- In alcuni casi, il caricamento del codice da un file ZIP o JAR è più veloce rispetto al caricamento da molti file separati.
Richieste di warmup
Le richieste di preriscaldamento sono un tipo specifico di richiesta di caricamento che carica il codice dell'applicazione in un'istanza in anticipo, prima che vengano effettuate richieste attive.
Le istanze con scalabilità manuale o di base non ricevono una richiesta /_ah/warmup
.
Tempo di attività istanza
App Engine tenta di mantenere in esecuzione le istanze di scalabilità manuale e di base indefinitamente. Tuttavia, al momento non è garantito il tempo di attività per le istanze con scalabilità manuale e di base. I guasti hardware e software che causano l'interruzione anticipata o riavvii frequenti possono verificarsi senza preavviso e possono richiedere molto tempo per essere risolti. Pertanto, devi strutturare la tua applicazione in modo da tollerare questi guasti.
Ecco alcune buone strategie per evitare i tempi di riposo dovuti ai riavvii delle istanze:
- Riduci il tempo necessario per riavviare le istanze o per avviarne di nuove.
- Per i calcoli di lunga durata, crea periodicamente dei checkpoint in modo da poter riprendere da quello stato.
- L'app deve essere "senza stato" in modo che non venga memorizzato nulla nell'istanza.
- Utilizza le code per eseguire attività asincrone.
- Se configuri le istanze per il ridimensionamento manuale:
- Utilizza il bilanciamento del carico su più istanze.
- Configura più istanze del necessario per gestire il traffico normale.
- Scrivi una logica di riserva che utilizzi i risultati memorizzati nella cache quando non è disponibile un'istanza di scalabilità manuale.
NTP con l'ambiente standard di App Engine
L'ambiente standard di App Engine dispone di servizi NTP (Network Time Protocol) che utilizzano i server NTP di Google. Tuttavia, il servizio NTP non è modificabile.