standard google features engine docs apps app java google-app-engine memcached google-cloud-datastore static-variables

java - features - Google App Engine: ¿Memcache o variable estática?



google apps engine (3)

Bueno, creo que tengo una duda muy básica aquí:

Estoy desarrollando una aplicación en GAE (Java) y realizando una consulta al almacén de datos que devuelve muchas entidades, por lo que necesito guardarla en caché. Estaba usando memcache y estaba funcionando muy bien, pero si mantengo la lista de entidades en una variable estática, la solicitud completa es el doble de rápida que usar memcache. Creo que es porque no estoy deserializando las entidades todo el tiempo.

¿Cuál sería el inconveniente de usar una variable estática en lugar de memcache? No sé si podría haber varias instancias de mi aplicación en la nube y, por lo tanto, varias instancias de mi variable estática.

La lista de entidades que estoy tratando de almacenar en caché son las mejores (mayor puntuación) publicaciones de la última semana. Tomo esa lista y elijo 5 publicaciones aleatorias y las muestro en un par de páginas.

¡Gracias por la ayuda!


App Engine escala mediante la creación de nuevas instancias de su aplicación a medida que aumenta el número de usuarios que la golpean. Como dijo Drudru, diferentes usuarios pueden ser atendidos por diferentes instancias. En general, memcache es el lugar más rápido para almacenar algo que desea que sea coherente a nivel mundial. Sin embargo, en su caso puede haber algún margen de mejora.

Menciona que tiene una lista de publicaciones y elige al azar 5 para mostrar a los usuarios. ¿Importa si 2 usuarios diferentes ven un conjunto diferente de 5? Si estás eligiendo aleatorios de todos modos, tal vez no importa. Luego, puede almacenar la lista completa de publicaciones en memcache, sacar 5 aleatorias de memcache y almacenarlas en una variable estática.

Segundo, ¿qué es exactamente lo que estás recordando y cómo lo estás sacando? ¿Estás almacenando un montón de publicaciones completas en memcache, obteniéndolas todas y luego seleccionando 5? ¿Tal vez podría simplemente descargar la lista de publicaciones, elegir 5 y solo obtener las 5 que necesita? Si crees que es la deserialización lo que te está ralentizando, esto podría ayudarte. ¿Está haciendo algún procesamiento en las publicaciones después de recibirlas? Si es así, ¿podrían guardarse en caché los resultados de ese procesamiento?


No se puede confiar en que las variables estáticas (o cualquier otra cosa en la memoria JVM) estén presentes cuando llegue la próxima solicitud, porque Google es libre de iniciar y detener máquinas virtuales cuando lo desee. Por lo que parece, parece que prefieren iniciar JVM adicionales en lugar de subprocesos adicionales en el mismo JVM, lo que agrava este problema.

Sin embargo, debería poder utilizar variables estáticas como una capa de caché, siempre que tenga una forma de cargar los datos de otro lugar si desapareció.

Tampoco intentaría exagerar con el uso de memoria allí, debe haber una cuota sobre la cantidad de memoria que puede utilizar.


Sí, no hay garantía de que su instancia sea la misma para varios usuarios en Internet. Podría terminar leyendo constantemente esto en una estática en el peor de los casos. El memcache tiene una mayor garantía de estar disponible. Solo usaría el memcache, y su aplicación no debería tener problemas de escala en el futuro.