Pregunta

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

Estoy desarrollando una aplicación en GAE (Java) y la realización de una consulta al almacén de datos que devuelve un montón de las entidades, así que tengo que almacenar en caché. Yo estaba usando Memcache y que estaba trabajando muy bien, pero si sigo la lista de entidades en una variable estática, toda la solicitud se pasa como el doble de rápido que el uso de Memcache. Creo que es porque no estoy deserializar las entidades todo el tiempo.

¿Cuál sería el inconveniente de utilizar una variable estática en cambio en 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 elegir 5 mensajes aleatorios y mostrarlos en un par de páginas.

Gracias por la ayuda!

¿Fue útil?

Solución

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

mencionar que tiene una lista de mensajes y elige al azar 5 para mostrar a los usuarios. Qué importa si 2 usuarios diferentes ver un conjunto diferente de 5? Si usted está eligiendo los aleatorios de todos modos, tal vez no importa. Posteriormente, se podría almacenar la lista completa de los mensajes en Memcache, y tire de los al azar 5 de Memcache y almacenarlos en una variable estática.

En segundo lugar, ¿qué es exactamente lo que memcaching, y cómo la están tirando de él? ¿Está guardando un montón de mensajes completos en Memcache, para que hagan todo, a continuación, elegir 5? Tal vez usted podría descargar la lista de mensajes, seleccione 5, y sólo conseguir la 5 que necesita? Si usted piensa que es el deserializar que está ralentizando, esto podría ayudar. Estás haciendo ningún tipo de procesamiento de los mensajes después de que los obtiene? Si es así, se podrían almacenar en caché los resultados de ese procesamiento?

Otros consejos

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. Desde el aspecto de la misma, que parecen preferir iniciar JVM adicionales en lugar de hilos adicionales en la misma JVM, lo que agrava este problema.

Sin 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.

Me tampoco trato de ir al agua con el uso de memoria no, tiene que haber una cuota de la cantidad de memoria que puede utilizar.

Sí, no hay garantía de que la instancia será el mismo para varios usuarios en Internet. Usted podría terminar constantemente leyendo esto en una estática en el peor de los casos. El Memcache tiene una mayor garantía de estar disponible. Yo sólo tiene que utilizar el memcache, y su aplicación no debería tener ningún problema de escala en el futuro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top