App Engine genera report sull'utilizzo relativi alle prestazioni e all'utilizzo delle risorse della tua applicazione. Di seguito sono elencate potenziali strategie per gestire le risorse in modo più efficiente. Per ulteriori informazioni, consulta la pagina relativa ai prezzi.
Visualizzazione dei rapporti di utilizzo
Quando valuti il rendimento dell'applicazione, devi controllare il numero di istanze in esecuzione e il modo in cui l'applicazione consuma le risorse.
Visualizzare i report sull'utilizzo della dashboard
Visualizzare la pagina Istanze
Le sezioni seguenti suggeriscono alcune strategie per la gestione delle risorse.
Gestione della scalabilità dinamica delle istanze
Riduzione della latenza
La latenza dell'applicazione influisce sul numero di istanze necessarie per gestire il traffico. Riducendo la latenza, puoi ridurre il numero di istanze utilizzate per eseguire la tua applicazione. Cloud Trace è uno strumento utile per visualizzare i dati sulla latenza e comprendere le potenziali modifiche per ridurla.
Dopo aver utilizzato Cloud Trace per visualizzare la latenza, prova alcune delle seguenti strategie per ridurla:
- Aumenta la memorizzazione nella cache dei dati condivisi a cui si accede di frequente: un altro modo per dire: utilizza Memcache di App Engine. Inoltre, l'impostazione delle intestazioni cache-control dell'applicazione può avere un impatto significativo sull'efficienza con cui i dati vengono memorizzati nella cache da server e browser. Anche la memorizzazione nella cache di alcuni elementi per pochi secondi può influire sull'efficienza con cui la tua applicazione gestisce il traffico.
- Utilizza Memcache di App Engine in modo più efficiente: utilizza chiamate batch per get, set, delete e così via anziché una serie di chiamate singole. Valuta la possibilità di utilizzare l'API Memcache Async.
- Utilizza le attività per le funzionalità non legate alle richieste: se la tua applicazione svolge un lavoro che può essere svolto oltre l'ambito di una richiesta rivolta agli utenti, inseriscilo in un'attività. L'invio di questo lavoro alla coda di attività anziché attendere il completamento prima di restituire una risposta può ridurre notevolmente la latenza per l'utente. La coda di attività può quindi offrirti un maggiore controllo sulle frequenze di esecuzione e contribuire ad attenuare il carico.
- Utilizzare Firestore in modalità Datastore (Datastore) in modo più efficiente: di seguito sono riportati ulteriori dettagli.
- Esegui più chiamate URL Fetch in parallelo:
- Raggruppa più chiamate URL Fetch anziché gestirle singolarmente all'interno di singole richieste rivolte agli utenti e gestirle in un'attività offline in parallelo tramite URL Fetch asincrono.
- Utilizza l'API URL Fetch asincrona.
- Per le sessioni HTTP, scrivi in modo asincrono: Java consente di configurare l'applicazione in modo da scrivere in modo asincrono i dati delle sessioni HTTP in Datastore aggiungendo
<async-session-persistence enabled="true"/>
aappengine-web.xml
. I dati della sessione vengono sempre scritti in modo sincrono in App Engine Memcache e se una richiesta tenta di leggere i dati della sessione quando App Engine Memcache non è disponibile, verrà eseguito il failover su Datastore, che potrebbe non avere ancora l'aggiornamento più recente. Ciò significa che esiste un piccolo rischio che la tua applicazione visualizzi dati di sessione non aggiornati, ma per la maggior parte delle applicazioni il vantaggio della latenza supera di gran lunga il rischio.
Modificare le impostazioni di prestazioni della scalabilità automatica
Il file di configurazione appengine-web.xml
contiene diverse impostazioni che puoi utilizzare per regolare il compromesso tra prestazioni e carico delle risorse per una versione specifica della tua app. Per un elenco delle impostazioni di scalabilità automatica disponibili, consulta gli elementi di scalabilità.
Guarda il video Nuove impostazioni del programma di App Engine per vedere gli effetti di queste impostazioni.
Attivare le richieste simultanee in Java
L'attivazione di questa impostazione riduce il numero di istanze necessarie per gestire il traffico per la tua applicazione, ma l'applicazione deve essere sicura per i thread affinché funzioni correttamente. Scopri come utilizzare le richieste simultanee attivando threadsafe nel file appengine-web.xml
.
Configurazione delle impostazioni della coda di attività
Le impostazioni predefinite per la coda di attività sono ottimizzate per il rendimento. Con questi valori predefiniti, se inserisci contemporaneamente più attività in una coda, è probabile che vengano avviate nuove istanze frontend. Ecco alcuni suggerimenti su come ottimizzare la coda di attività per risparmiare ore di istanza:
- Imposta l'intestazione X-AppEngine-FailFast sulle attività non sensibili alla latenza. Questa intestazione indica allo scheduler di rifiutare immediatamente la richiesta se non è disponibile un'istanza esistente. La coda di attività riproverà e eseguirà il back-off fino a quando un'istanza esistente non sarà disponibile per soddisfare la richiesta. Tuttavia, è importante notare che quando le richieste con X-AppEngine-FailFast impostato occupano le istanze esistenti, le richieste senza questo header impostato possono comunque causare l'avvio di nuove istanze.
- Configura le impostazioni della coda di attività.
- Se imposti il parametro "rate" su un valore inferiore, la coda di attività eseguirà le attività a una velocità inferiore.
- Se imposti il parametro "max_concurrent_requests" su un valore inferiore, si eseguiranno meno attività contemporaneamente.
Pubblica contenuti statici, se possibile
La pubblicazione di contenuti statici in Java è gestita da un'infrastruttura App Engine specializzata, che non consuma ora di istanza. Se devi impostare intestazioni personalizzate, utilizza l'API Blobstore. La pubblicazione effettiva della risposta del blob non consuma ore di istanze.
Gestione dello spazio di archiviazione delle applicazioni
App Engine calcola i costi di archiviazione in base alle dimensioni delle entità nel Datastore, alle dimensioni degli indici di Datastore, alle dimensioni delle attività nella coda di attività e alla quantità di dati archiviati in Blobstore. Ecco alcune operazioni che puoi svolgere per assicurarti di non memorizzare più dati del necessario:
- Elimina le entità o i blob di cui la tua applicazione non ha più bisogno.
- Rimuovi gli indici non necessari, come descritto nella sezione Gestire l'utilizzo del datastore di seguito, per ridurre i costi di archiviazione degli indici.
Gestione dell'utilizzo di Datastore
App Engine tiene conto del numero di operazioni eseguite in Datastore. Di seguito sono riportate alcune strategie che possono ridurre il consumo di risorse di Datastore e la latenza delle richieste a Datastore:
- Il visualizzatore dei dati della console Google Cloud mostra il numero di operazioni di scrittura obbligatorie per creare ogni entità nel tuo Datastore locale. Puoi utilizzare queste informazioni per comprendere il costo di scrittura di ogni entità. Per informazioni su come interpretare questi dati, consulta la sezione Informazioni sui costi di scrittura.
- Rimuovi gli indici non necessari, in modo da ridurre i costi di archiviazione e scrittura delle entità. Utilizza la funzionalità"Ottieni indici" per vedere quali indici sono definiti nella tua applicazione. Puoi vedere quali indici vengono attualmente pubblicati per la tua applicazione nella pagina Ricerca della console Google Cloud.
- Quando progetti il tuo modello dei dati, potresti essere in grado di scrivere le query in modo da evitare del tutto gli indici personalizzati. Leggi la documentazione su Query e indici per saperne di più su come App Engine genera gli indici.
- Se possibile, sostituisci le proprietà indicizzate (che sono quelle predefinite) con proprietà non indicizzate (Java), che riducono il numero di operazioni di scrittura di Datastore quando inserisci un'entità. Fai attenzione: se in un secondo momento decidi di dover eseguire query sulla proprietà non indicizzata, non solo dovrai modificare il codice per utilizzare nuovamente le proprietà indicizzate, ma dovrai eseguire un'operazione map reduce su tutte le entità per reimpostarle.
- Grazie ai miglioramenti al pianificatore delle query di Datastore nelle release di App Engine 1.5.2 e 1.5.3, ora le query potrebbero richiedere meno indici rispetto al passato. Sebbene tu possa comunque scegliere di mantenere alcuni indici personalizzati per motivi di prestazioni, potresti essere in grado di eliminarne altri, riducendo i costi di archiviazione e scrittura delle entità.
- Riconfigura il modello dei dati in modo da poter sostituire le query con il recupero per chiave, che è più economico ed efficiente.
- Se possibile, utilizza query solo con chiavi anziché query con entità.
- Per ridurre la latenza, sostituisci più
get()
entità con unget()
batch. - Utilizza i cursori Datastore per l'impaginazione anziché l'offset.
- Esegui il parallelismo di più RPC di Datastore tramite l'API Datastore asincrona.
Nota: le operazioni Datastore ridotte comprendono chiamate per l'allocazione di ID o query basate solo su chiavi di Datastore. Per ulteriori informazioni sui costi, consulta la pagina relativa ai prezzi.
Gestione della larghezza di banda
Per ridurre la larghezza di banda in uscita, puoi
impostare l'intestazione Cache-Control
appropriata sulle risposte e impostare date di scadenza ragionevoli
per i file statici. L'utilizzo di intestazioni Cache-Control
pubbliche in questo modo consentirà ai server proxy e ai browser dei tuoi clienti di memorizzare nella cache le risposte per il periodo di tempo designato.
La larghezza di banda in entrata è più difficile da controllare, poiché corrisponde alla quantità di dati inviati dagli utenti alla tua app. Tuttavia, puoi utilizzare le regole del firewall di App Engine per consentire o limitare intervalli di indirizzi IP e sottoreti.