18

Beh, credo di avere un dubbio molto di base qui:Google App Engine: Memcache o variabile statica?

Sto sviluppando un'applicazione sul GAE (Java) e l'esecuzione di una query per l'archivio dati che restituisce un sacco di entità, quindi ho bisogno di memorizzare nella cache esso . Stavo usando memcache e funzionava benissimo, ma se tengo la lista delle entità in una variabile statica, l'intera richiesta va il doppio rispetto a quella di memcache. Penso che sia perché non sto deserializzando le entità tutto il tempo.

Quale sarebbe lo svantaggio di utilizzare una variabile statica invece su memcache? Non so se ci potrebbero essere diverse istanze della mia applicazione nel cloud e quindi diverse istanze della mia variabile statica?

L'elenco di entità che sto tentando di memorizzare nella cache sono i migliori (più punteggio) dei post dell'ultima settimana. Prendo quella lista e scelgo 5 post casuali e li mostro in un paio di pagine.

Grazie per l'aiuto!

+3

Ho iniziato un esperimento per scoprire con quale frequenza GAE offre una nuova JVM: http://thrdcntr.appspot.com/. Apparentemente, generano nuove VM (a differenza dei nuovi thread nella stessa VM) quando il carico è alto. Bloccano anche le macchine virtuali inutilizzate dopo un po 'di tempo (ma non troppo spesso). – Thilo

risposta

16

App Engine scala creando nuove istanze dell'applicazione al crescere del numero di utenti che la colpiscono. Come ha detto Drudru, diversi utenti potrebbero essere serviti da diverse istanze. In generale, memcache è il posto più veloce dove archiviare qualcosa che si desidera essere globalmente coerente. Tuttavia, nel tuo caso potrebbero esserci margini di miglioramento.

Hai detto di avere un elenco di post e di scegliere casualmente 5 per mostrare agli utenti. Importa se 2 utenti diversi vedono un diverso set di 5? Se scegli quelli a caso, comunque, non importa. Quindi è possibile memorizzare l'intero elenco di messaggi in memcache e prelevarne 5 a caso da memcache e memorizzarli in una variabile statica.

In secondo luogo, che cosa stai esattamente memcaching e come lo stai estraendo? Stai memorizzando un intero gruppo di post completi in memcache, recuperandoli tutti, quindi scegliendo 5? Forse potresti semplicemente scaricare l'elenco dei messaggi, scegliere 5 e ottenere solo il 5 di cui hai bisogno? Se pensi che sia la deserializzazione a rallentarti, questo potrebbe aiutarti. Stai facendo qualche elaborazione sui post dopo averli ottenuti? In tal caso, i risultati di tale elaborazione potrebbero essere memorizzati nella cache?

+0

Sì: sto memcaching l'intera lista di post e li ottengo tutti, quindi scegliendo 5. Sarebbe più veloce (e più intelligente!) Se ottengo solo il 5 che voglio. Come hai detto, non importa se 2 utenti diversi vedono un diverso set di 5.Infatti, se un utente ricarica la pagina, il set sarà diverso, quindi forse potrei continuare ad usare la variabile statica? Non mi interessa davvero se ci sono diverse istanze della lista che sono diverse. Grazie Peter !! – Damian

+0

Se si desidera provare a ottenere il massimo delle prestazioni possibili, è possibile provare due livelli di cache. Quando arriva una richiesta, devi prima controllare se hai un valore valido nella cache delle variabili statiche e, in caso contrario, dovresti controllare memcache. Se non c'è nulla di valido in memcache, allora si prendono i dati dal datastore e si popolano sia memcache che la variabile statica. –

+1

Un'ultima cosa: quanto questa operazione influisce sul tempo di caricamento totale della pagina? Se ottieni questa operazione per andare da 10 ms a 5 ms, è bello, ma se hai qualche altra operazione che richiede 300ms, dovresti focalizzare la tua energia lì prima :) –

3

Sì, non vi è alcuna garanzia che la tua istanza sarà la stessa per vari utenti su Internet. Potresti finire a leggerlo costantemente in una situazione statica nel peggiore dei casi. Il memcache ha una maggiore garanzia di essere disponibile. Vorrei solo usare memcache e la tua app non dovrebbe avere problemi di scala in futuro.

6

Non è possibile fare affidamento su variabili statiche (o qualsiasi altra cosa nella memoria JVM) per trovarsi in giro quando viene ricevuta la richiesta successiva, perché Google è libero di avviare e arrestare le macchine virtuali quando ne hanno voglia. A giudicare dall'aspetto, sembrano preferire l'avvio di JVM aggiuntive invece di thread aggiuntivi nella stessa JVM, il che complica questo problema.

Tuttavia, dovresti essere in grado di utilizzare variabili statiche come livello di cache, purché tu abbia un modo per caricare i dati da qualche altra parte se fosse andato via.

Non vorrei anche provare a esagerare con l'utilizzo della memoria, ci deve essere una quota sulla quantità di memoria che è possibile utilizzare.