Le istanze sono i blocchi di base di App Engine e forniscono tutte le risorse necessarie per ospitare correttamente l'applicazione. In un determinato momento, la tua applicazione può essere eseguita su una o più istanze con richieste distribuite su tutte. Ogni istanza include un livello di sicurezza per garantire che le istanze non possano influenzarsi inavvertitamente a vicenda.
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 dalla quantità di traffico. Per determinare come e quando vengono create nuove istanze, devi specificare un tipo di scalabilità per la tua app. Le impostazioni di scalabilità vengono applicate a livello di versione di App Engine come parte 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
Specifichi il tipo di scalabilità nel
appengine-web.xml della tua app.
Per impostazione predefinita, la tua app utilizza 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 le soglie per ciascuna di queste metriche, nonché un numero minimo di istanze da mantenere in esecuzione in qualsiasi momento configurando l'elemento
automatic_scaling.
- Scalabilità di base
- Lo scaling di base crea istanze quando l'applicazione riceve richieste. Ogni istanza verrà arrestata quando l'applicazione diventa inattiva. Lo scaling di base è ideale per il lavoro intermittente o basato sull'attività utente.
- Scalabilità manuale
- La scalabilità manuale specifica il numero di istanze che vengono eseguite continuamente 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 richieste |
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 di richieste ed emette un errore che il tuo codice deve gestire.
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 di richieste ed emette un errore che il tuo codice deve gestire.
Un'istanza con scalabilità di base può scegliere di gestire |
Come lo scaling 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, l'istanza viene arrestata.
|
Le istanze rimangono in memoria e lo stato viene conservato tra le richieste. Quando
le istanze vengono arrestate, 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 completarsi
prima dell'arresto.
|
| Avvio e arresto | Le istanze vengono create on demand per gestire le richieste e vengono disattivate automaticamente quando sono inattive. |
Le istanze vengono create on demand per gestire le richieste e vengono arrestate automaticamente
quando sono inattive, in base al parametro di configurazione idle-timeout. Un'istanza
arrestata manualmente
ha 30 secondi per completare la gestione delle richieste prima di essere terminata
forzatamente.
|
Le istanze ricevono automaticamente una richiesta di avvio da App Engine sotto forma di una richiesta GET vuota a /_ah/start. Come per
lo scaling di base, un'istanza
arrestata manualmente
ha 30 secondi per completare la gestione delle richieste prima di essere terminata
forzatamente.
|
| Indirizzabilità dell'istanza | 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 di sottodomini jolly per un dominio personalizzato, puoi anche indirizzare
un servizio o una qualsiasi delle sue istanze tramite un URL del modulo
https://s.domain.com o https://i.s.domain.com.
Puoi memorizzare in modo affidabile lo stato nella cache di ogni istanza e recuperarlo nelle
richieste successive.
|
Come lo scaling di base. |
| Scalabilità |
App Engine scala automaticamente il numero di istanze in risposta al volume di elaborazione. Questo ridimensionamento tiene conto delle
impostazioni automatic_scaling fornite
per 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 live viene scalato
in base al volume di elaborazione.
|
Configura il numero di istanze di ogni versione nel file di configurazione del servizio. Il numero di istanze di solito corrisponde alle dimensioni di un set di dati memorizzato 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 alimentate da un numero qualsiasi di istanze dinamiche in un determinato momento, a seconda del volume di richieste in entrata. Man mano che le richieste per la tua applicazione aumentano, potrebbe aumentare anche il numero di istanze dinamiche.
App con scalabilità di base
Se utilizzi la scalabilità di base, App Engine tenta di mantenere bassi i costi, anche se ciò potrebbe comportare una latenza maggiore all'aumentare del volume di richieste in entrata.
Quando nessuna delle istanze esistenti è disponibile per gestire una richiesta in entrata, App Engine avvia una nuova istanza. Anche dopo aver avviato una nuova istanza, alcune richieste potrebbero dover essere messe in coda finché la nuova istanza non completa il processo di avvio. Se hai bisogno della latenza più bassa possibile, valuta la possibilità di utilizzare la scalabilità automatica, che crea nuove istanze in modo preventivo per ridurre al minimo la latenza.
App con scalabilità automatica
Se utilizzi lo scalabilità automatica, ogni istanza della tua app ha la propria coda per le richieste in entrata. Prima che le code diventino abbastanza lunghe da avere un effetto notevole 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 raggiungere un compromesso tra le prestazioni che desideri e il costo che puoi sostenere. La seguente tabella 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 in corrispondenza della quale verranno avviate più istanze per gestire il traffico. |
| Utilizzo velocità effettiva target | Imposta la soglia di velocità effettiva per il numero di richieste simultanee dopo la quale verranno avviate altre istanze per gestire il traffico. |
| Numero max richieste in parallelo | Imposta il numero massimo di richieste simultanee che un'istanza può accettare prima che lo scheduler generi una nuova istanza. |
Guarda il video Impostazioni dello scheduler di App Engine per vedere gli effetti di queste impostazioni.
Riduzione della scalabilità
Quando i volumi di richieste diminuiscono, App Engine riduce il numero di istanze. Questo scalamento verso il basso contribuisce a garantire che tutte le istanze attuali dell'applicazione vengano utilizzate per un'efficienza e un'efficacia in termini di costi ottimali.
Quando un'applicazione non viene utilizzata, App Engine disattiva le istanze dinamiche associate, ma le ricarica 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. Se imposti un numero appropriato di istanze inattive per la tua applicazione in base al volume delle richieste, la tua applicazione può gestire ogni richiesta con una latenza minima, a meno che non si verifichi un volume di richieste anormalmente elevato.
Riduzione delle risorse nella scalabilità automatica
Se la tua app utilizza la scalabilità automatica, sono necessari circa 15 minuti di
inattività prima che le istanze inattive inizino a essere arrestate. Per mantenere in esecuzione una o più istanze inattive, imposta il valore di min_idle_instances su 1 o un valore 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 controllare questolimitazione di frequenzao la frequenza del numero di richieste inviate al secondo, se possibile. Ad esempio, se utilizzi Google Tasks, puoi controllare la velocità con cui vengono inviate le attività.
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 arrestata. Tutte le istanze dello stesso servizio e della stessa versione condividono lo stesso stato. Modifica lo stato delle istanze gestendo le versioni. Puoi:
- Utilizza la pagina Versioni nella consoleGoogle Cloud .
- Utilizza i comandi
gcloud app versions startegcloud app versions stop - Utilizzare il servizio Modules
Avvio
Ogni istanza di servizio viene creata in risposta a una richiesta di avvio, ovvero una richiesta HTTP GET 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 avvio 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.
L'avvio delle istanze con scalabilità manuale, di base e automatica è diverso. Quando avvii un'istanza di scalabilità 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 le consente di accettare il traffico, ma la richiesta /_ah/start non viene inviata a un'istanza finché non riceve la prima richiesta utente. Più istanze di scalabilità di base vengono avviate 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, viene considerata avviata correttamente e può gestire richieste aggiuntive. In caso contrario, App Engine termina l'istanza. Le istanze di scalabilità manuale vengono riavviate immediatamente, mentre le istanze di scalabilità di base vengono riavviate solo quando necessario per la gestione del traffico.
Arresto
La procedura di spegnimento può essere attivata da una serie di eventi pianificati e non pianificati, ad esempio:
- Ci sono troppe istanze e non abbastanza richieste di app (traffico).
- Arresti manualmente un'istanza.
- Esegui il deployment di una versione aggiornata nel servizio.
- L'istanza supera la memoria massima per il
instance_classconfigurato. - La tua applicazione esaurisce la quota di ore di istanza.
- L'istanza viene spostata su un'altra macchina perché quella attuale che esegue l'istanza viene riavviata oppure App Engine ha spostato l'istanza per migliorare la distribuzione del carico.
Uno dei vantaggi della piattaforma "paga solo per ciò che ti serve " dell'ambiente standard App Engine, come descritto in precedenza in Riduzione della scalabilità, è che il sistema esegue la scalabilità automatica del numero di istanze fino a zero in assenza di traffico. In questo modo, App Engine diventa una soluzione conveniente per le piccole applicazioni che non ricevono richieste continue. Quando un'istanza deve essere arrestata, le nuove richieste in entrata vengono indirizzate ad altre istanze (se presenti) e le richieste attualmente in elaborazione hanno il tempo di essere completate.
Quando un'istanza deve essere arrestata, App Engine invia un segnaleKILL
(SIGKILL), terminando l'istanza.
Caricamento delle richieste in corso…
Quando App Engine crea una nuova istanza per la tua applicazione, l'istanza deve prima caricare tutte le librerie e le risorse necessarie per gestire la richiesta. Ciò si verifica durante la prima richiesta all'istanza, chiamata richiesta di caricamento. Durante una richiesta di caricamento, l'applicazione viene inizializzata, il che comporta un tempo di elaborazione più lungo.
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 live.
Le istanze di 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 un uptime per le istanze di scalabilità manuale e di base. Guasti hardware e software che causano l'interruzione anticipata o riavvii frequenti possono verificarsi senza preavviso e la risoluzione può richiedere molto tempo; pertanto, devi creare la tua applicazione in modo da tollerare questi guasti.
Ecco alcune buone strategie per evitare tempi di inattività dovuti ai riavvii delle istanze:
- Ridurre il tempo necessario per il riavvio delle istanze o per l'avvio di nuove istanze.
- Per i calcoli di lunga durata, crea periodicamente dei checkpoint in modo da poter riprendere da quello stato.
- La tua app deve essere "stateless", in modo che non venga memorizzato nulla sull'istanza.
- Utilizza le code per eseguire attività asincrone.
- Se configuri le istanze per la scalabilità manuale:
- Utilizza il bilanciamento del carico su più istanze.
- Configura più istanze del necessario per gestire il traffico normale.
- Scrivi una logica di fallback che utilizzi i risultati memorizzati nella cache quando un'istanza di scalabilità manuale non è disponibile.
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.