Questa pagina fornisce una panoramica del servizio memcache di App Engine. Le applicazioni web scalabili ad alte prestazioni spesso usano una cache di dati in memoria distribuita prima o al posto di un robusto spazio di archiviazione permanente per alcune attività. A questo scopo, App Engine include un servizio di cache di memoria. Per scoprire come configurare, monitorare e utilizzare il servizio memcache, leggi l'articolo sull'utilizzo di Memcache.
Quando utilizzare una cache in memoria
Una cache della memoria viene utilizzata per velocizzare le query comuni del datastore. Se molte richieste richiedono la stessa query con gli stessi parametri e le modifiche ai risultati non devono essere visualizzate immediatamente sul sito web, l'applicazione può memorizzare i risultati nella cache. Le richieste successive possono controllare la cache memcache ed eseguire la query datastore solo se i risultati sono assenti o scaduti. I dati della sessione, le preferenze dell'utente e altri dati restituiti dalle query per le pagine web sono ideali per la memorizzazione nella cache.
Memcache può essere utile per altri valori temporanei. Tuttavia, quando valuti se archiviare un valore solo nella memcache e non tramite un altro spazio di archiviazione permanente, assicurati che la tua applicazione si comporti in modo accettabile quando il valore non è improvvisamente disponibile. I valori possono scadere dalla memcache in qualsiasi momento e possono essere scaduti prima della scadenza impostata per il valore. Ad esempio, se l'improvvisa assenza dei dati sulla sessione di un utente causa un malfunzionamento della sessione, probabilmente questi dati dovrebbero essere archiviati nel datastore oltre che nella memcache.
Livelli di servizio
App Engine supporta due livelli di servizio memcache:
Memcache condivisa è l'impostazione predefinita gratuita per le applicazioni App Engine. Offre la capacità della cache al meglio delle possibilità e è soggetta alla domanda complessiva di tutte le applicazioni App Engine che utilizzano il servizio memcache condiviso.
Memcache dedicata fornisce una capacità di cache fissa assegnata esclusivamente alla tua applicazione. È fatturato in base alle GB di dimensione della cache e richiede l'abilitazione della fatturazione. Avere controllo sulle dimensioni della cache significa che la tua app può avere prestazioni più prevedibili e con meno letture da uno spazio di archiviazione più costoso e durevole.
Entrambi i livelli di servizio memcache utilizzano la stessa API. Per configurare il servizio memcache per la tua applicazione, consulta la pagina relativa all'utilizzo di Memcache.
La tabella seguente riepiloga le differenze tra le due classi di servizio memcache:
Funzionalità | Memcache dedicata | Memcache condivisa |
---|---|---|
Prezzo | 0,06 $ per GB all'ora | Nessun costo |
Capacità |
|
Nessuna capacità garantita |
Prestazioni | Fino a 10.000 letture o 5.000 scritture (esclusive) al secondo per GB (elementi < 1 kB). Per maggiori dettagli, vedi Statistiche cache. | Non garantita |
Negozio duraturo | No | No |
SLA | Nessuno | Nessuno |
La fatturazione memcache dedicata viene addebitata in incrementi di 15 minuti. Se la valuta utilizzata per il pagamento è diversa da USD, si applicano i prezzi elencati nella tua valuta negli SKU di Cloud Platform.
Se la tua app richiede più capacità memcache, contatta il nostro team di vendita.
Limiti
All'uso del servizio memcache si applicano i limiti seguenti:
- La dimensione massima di un valore dei dati memorizzati nella cache è 1 MB (10^6 byte).
- Una chiave non può superare i 250 byte. Nel runtime Python, le chiavi composte da stringhe più lunghe di 250 byte verranno sottoposte ad hashing. (gli altri runtime si comportano in modo diverso).
- Le operazioni batch "multi" possono avere un numero qualsiasi di elementi. Le dimensioni totali della chiamata e le dimensioni totali dei dati recuperati non devono superare i 32 megabyte.
- Una chiave memcache non può contenere un byte nullo.
Come scadono i dati memorizzati nella cache
Memcache contiene le coppie chiave-valore. Le coppie in memoria cambiano in qualsiasi momento, man mano che gli elementi vengono scritti e recuperati dalla cache.
Per impostazione predefinita, i valori archiviati in memcache vengono conservati il più a lungo possibile. I valori possono essere eliminati dalla cache quando un nuovo valore viene aggiunto alla cache e la cache è in esaurimento. Quando i valori vengono rimossi a causa della pressione della memoria, i valori meno utilizzati vengono rimossi per primi.
L'app può indicare una scadenza quando viene archiviato un valore, espresso come numero di secondi in relazione all'aggiunta del valore o come tempo Unix assoluto in futuro (un numero di secondi a partire dalla mezzanotte del 1° gennaio 1970). Il valore viene rimosso non più tardi di questo periodo, anche se può essere rimosso in precedenza per altri motivi. L'aumento del valore memorizzato per una chiave esistente non aggiorna la data di scadenza.
In rari casi, i valori possono scomparire dalla cache prima della scadenza per motivi diversi dalla pressione della memoria. Sebbene memcache sia resiliente agli errori del server, i valori memcache non vengono salvati su disco, quindi un errore del servizio può causare la mancata disponibilità dei valori.
In generale, un'applicazione non deve aspettarsi che un valore memorizzato nella cache sia sempre disponibile.
Puoi cancellare l'intera cache di un'applicazione tramite l'API o nella sezione memcache di Google Cloud Console.
Statistiche cache
Operazioni al secondo per dimensione articolo
La memcache dedicata viene valutata in operazioni al secondo per GB, in cui
un'operazione viene definita come accesso a un singolo elemento cache, ad esempio get
,
set
o delete
. La percentuale di operazioni varia in base alle dimensioni dell'articolo
in base alla tabella riportata di seguito. Il superamento di queste valutazioni potrebbe causare una latenza maggiore dell'API o errori.
Le tabelle seguenti forniscono il numero massimo di operazioni esclusive, get-hit
o set
per GB di cache. Tieni presente che un'operazione get-hit
è una chiamata get
che rileva che esiste un valore archiviato con la chiave specificata e
restituisce tale valore.
Dimensioni articolo (kB) | Massimo get-hit operazioni/s |
Massimo set operazioni/s |
---|---|---|
≤1 | 10.000 | 5000 |
100 | 2000 | 1000 |
512 | 500 | 250 |
In teoria, un'app configurata per più GB di cache può raggiungere una percentuale di operazioni aggregate, calcolata come il numero di GB moltiplicato per la tariffa per GB. Ad esempio, un'app configurata per 5 GB di cache potrebbe raggiungere 50.000 operazioni memcache/sec su elementi da 1 KB. Il raggiungimento di questo livello richiede una buona distribuzione del carico attraverso lo spazio delle chiavi memcache.
Per ogni pattern IO, i limiti elencati sopra si riferiscono alle letture o alle scritture. Per le letture simultanee and, i limiti sono su una scala scorrevole. Più letture vengono eseguite, minore è il numero di scritture che possono essere effettuate e viceversa. Ciascuno dei seguenti è limiti di IOP di esempio per letture e scritture simultanee di 1 KB di valori per 1 GB di cache:
Lettura IOP | Scrittura IOP |
---|---|
10000 | 0 |
8000 | 1000 |
5000 | 2500 |
1000 | 4500 |
0 | 5000 |
Unità di calcolo Memcache (MCU)
La velocità effettiva di Memcache può variare a seconda delle dimensioni dell'elemento a cui accedi e dell'operazione che vuoi eseguire sull'elemento. Puoi associare approssimativamente un costo alle operazioni e stimare la capacità di traffico che puoi aspettarti da memcache dedicata utilizzando un'unità denominata Memcache Compute Unit (MCU). La MCU è definita in modo tale che tu possa aspettarti 10.000 MCU al secondo per GB di memoria cache dedicata. La console Google Cloud mostra la quantità di MCU attualmente utilizzata dalla tua app.
Tieni presente che la MCU è una stima statistica approssimativa e non è un'unità lineare. Ogni operazione cache che legge o scrive un valore ha un costo MCU corrispondente che dipende dalla dimensione del valore. L'MCU di set
dipende dalla
dimensione del valore: è il doppio del costo di un'operazione get-hit
riuscita.
Valore dell'elemento di valore (kB) | Costo dell'MCU per get-hit |
Costo dell'MCU per set |
---|---|---|
≤1 | 1.0 | 2.0 |
2 | 1.3 | 2,6 |
10 | 1,7 | 3.4 |
100 | 5.0 | 10,0 |
512 | 20,0 | 40,0 |
1024 | 50,0 | 100,0 |
Le operazioni che non leggono o scrivono un valore hanno un costo MCU fisso:
Operazione | MCU |
---|---|
get-miss |
1.0 |
delete |
2.0 |
increment |
2.0 |
flush |
100,0 |
stats |
100,0 |
Tieni presente che un'operazione get-miss
è un get
che rileva che non è presente alcun valore memorizzato con la chiave specificata.
Confronta e imposta
Confronta e imposta è una funzionalità che consente di gestire più richieste contemporaneamente per aggiornare il valore della stessa chiave memcache in modo atomico, evitando così le condizioni della gara.
Componenti logici chiave di confronto e impostazione
Se stai aggiornando il valore di una chiave memcache che potrebbe ricevere altre richieste di scrittura simultanee, devi utilizzare l'oggetto memcache Client
, che memorizza alcune informazioni sullo stato utilizzate dai metodi che supportano il confronto e l'impostazione. Non puoi utilizzare le funzioni memcache get()
o
set()
, perché sono stateless. La classe Client
non è sicura per il thread, pertanto non devi utilizzare lo stesso oggetto Client
in più thread.
Quando recuperi le chiavi, devi usare i metodi Client
memcache che supportano il confronto e l'impostazione: gets()
o get_multi()
con il parametro for_cas
impostato su
True
.
Quando aggiorni una chiave, devi utilizzare i metodi memcache Client
che supportano
il confronto e l'impostazione: cas()
o cas_multi()
.
L'altro componente logico chiave è il servizio memcache di App Engine e il relativo comportamento in merito al confronto e all'impostazione. Il servizio memcache di App Engine stesso funziona in modo atomico. In altre parole, quando due richieste in parallelo (per lo stesso ID app) utilizzano memcache, vengono inviate alla stessa istanza di servizio memcache e quest'ultimo ha un blocco interno sufficiente da consentire la serializzazione corretta delle richieste simultanee per la stessa chiave. In particolare, ciò significa che due richieste cas()
per la stessa chiave non vengono eseguite in parallelo: il servizio gestisce la prima richiesta arrivata fino al completamento (ovvero aggiornando il valore e il timestamp) prima che inizi a gestire la seconda richiesta.
Per scoprire come utilizzare le funzionalità di confronto e impostazione in Python, leggi Gestire le operazioni di scrittura simultanee.
Best practice
Di seguito sono riportate alcune best practice per utilizzare memcache:
Gestisci con facilità gli errori dell'API memcache. Le operazioni di Memcached possono non riuscire per vari motivi. Le applicazioni dovrebbero essere progettate per rilevare le operazioni non riuscite senza esporre questi errori agli utenti finali. Queste istruzioni si applicano in particolare alle operazioni Imposta.
Utilizza la funzionalità di batch dell'API quando possibile, soprattutto per gli elementi di piccole dimensioni. Questo contribuisce ad aumentare le prestazioni e l'efficienza della tua app.
Distribuisci il carico nello spazio delle chiavi memcache. Avere un singolo o piccolo set di elementi memcache che rappresentano una quantità sproporzionata di traffico ostacola la scalabilità dell'app. Queste istruzioni si applicano sia alle operazioni/sec sia alla larghezza di banda. Spesso puoi risolvere questo problema partizionando esplicitamente i dati.
Ad esempio, puoi suddividere un contatore aggiornato di frequente in più chiavi, leggerle nuovamente e sommarle solo quando è necessario un totale. Analogamente, potete dividere un dato di 500.000 dati che devono essere letti su ogni richiesta HTTP su più chiavi e leggerli utilizzando una singola chiamata API batch. Sarebbe meglio memorizzare il valore nella memoria dell'istanza. Per la memcache dedicata, il tasso di accesso di picco su una singola chiave dovrebbe essere 1-2 ordini di grandezza inferiore alla valutazione per GB.
Passaggi successivi
- Scopri come configurare, monitorare e utilizzare memcache in Utilizzo di Memcache.
- Esamina gli esempi di Memcache.