18

Bueno, yo creo que tengo una duda muy básico aquí:Google App Engine: Memcache o variable estática?

Estoy desarrollando una aplicación en GAE (Java) y la realización de una consulta al almacén de datos que devuelve una gran cantidad de las entidades, así que tengo que almacenar en caché . Estaba usando Memcache y funcionaba de maravilla, pero si mantengo la lista de entidades en una variable estática, toda la solicitud es el doble de rápida que el uso de 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 caché son los mejores (mayor puntuación) Mensajes de la última semana. Tomo esa lista y selecciono 5 publicaciones al azar y las muestro en un par de páginas.

¡Gracias por la ayuda!

+3

Comencé un experimento para averiguar con qué frecuencia GAE le proporciona una nueva JVM: http://thrdcntr.appspot.com/. Aparentemente, generan nuevas máquinas virtuales (a diferencia de los nuevos hilos en la misma máquina virtual) cuando la carga es alta. También cerraron las máquinas virtuales no utilizadas después de un tiempo (pero no demasiado a menudo). – Thilo

Respuesta

16

App Engine escala al crear nuevas instancias de su aplicación a medida que aumenta el número de usuarios que la utilizan. Como dijo drudru, los diferentes usuarios podrían ser atendidos por diferentes instancias. En general, Memcache es el lugar más rápido para almacenar algo que quiere ser globalmente consistente. Sin embargo, en su caso, puede haber algún margen de mejora.

Mencione 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 elige de todos modos los aleatorios, tal vez no importe. Luego, podría almacenar la lista completa de publicaciones en Memcache, y extraer 5 al azar de Memcache y almacenarlas en una variable estática.

En segundo lugar, ¿qué es exactamente lo que estás atrapando, y cómo lo estás sacando? ¿Estás almacenando un montón de publicaciones completas en Memcache, obteniéndolas todas y luego eligiendo 5? ¿Tal vez podrías simplemente descargar la lista de publicaciones, elegir 5 y obtener solo las 5 que necesitas? Si crees que es la deserialización lo que te está desacelerando, esto podría ayudar. ¿Estás haciendo algún procesamiento en las publicaciones después de que las obtengas? De ser así, ¿podrían almacenarse en caché los resultados de ese procesamiento?

+0

Sí: estoy archivando la lista completa de publicaciones y obteniéndolas todas, y luego elijo 5. Sería más rápido (¡y más inteligente!) Si obtengo solo las 5 que quiero. Como dijiste, no importa si 2 usuarios diferentes ven un conjunto diferente de 5.De hecho, si un usuario vuelve a cargar la página, el conjunto será diferente, ¿entonces quizás podría seguir usando la var estática? Realmente no me importa si hay varias instancias de la lista que son diferentes. Gracias Peter !! – Damian

+0

Si quiere intentar obtener el último rendimiento posible, puede probar dos niveles de caché. Cuando ingrese una solicitud, primero verificará si tiene un valor válido en su caché de variables estáticas, y de lo contrario, verificaría la memoria caché. Si no hay nada válido en Memcache, tomaría los datos del almacén de datos y llenaría tanto Memcache como su variable estática. –

+1

Una última cosa: ¿cuánto afecta esta operación a su tiempo total de carga de la página? Si obtienes esta operación para pasar de 10 ms a 5 ms, es genial, pero si tienes otra operación que demora 300 ms, primero debes enfocar tu energía :) –

3

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 ningún problema de escala en el futuro.

6

No se puede confiar en las variables estáticas (o cualquier otra cosa en la memoria JVM) para estar cerca cuando golpea la siguiente petición, ya que Google es libre para iniciar y parar las máquinas virtuales cuando se les da la gana. Por lo que parece, parecen preferir iniciar JVM adicionales en lugar de hilos adicionales en la misma JVM, lo que agrava este problema.

embargo, usted debe ser capaz de utilizar las variables estáticas como una capa de caché, siempre que tenga una forma de cargar los datos de algún otro lugar si se fue.

yo también trato de no ir al agua con el uso de memoria no, tiene que haber una cuota de la cantidad de memoria que puede utilizar.