Soy nuevo en Google App Engine y durante los últimos días he dedicado a crear una aplicación utilizando Memcache de GAE para almacenar datos. En base a mis hallazgos iniciales, parece que el Memcache de GAE NO es global.¿Memcache (Java) para Google App Engine es un caché global?
Déjame explicarte más. Soy consciente de que diferentes solicitudes a GAE pueden ser atendidas por diferentes instancias (de hecho, esto parece suceder con bastante frecuencia). Es por esta razón que estoy usando Memcache para almacenar algunos datos compartidos, a diferencia de un Mapa estático. Pensé (quizás incorrectamente) que este era el punto de usar un caché distribuido para que cualquier nodo pudiera acceder a los datos.
Otra posibilidad definitiva es que estoy haciendo algo mal. He probado tanto JCache como la API de Memcache de bajo nivel (estoy escribiendo Java, no Python). Esto es lo que estoy haciendo para recuperar la memoria caché:
MemcacheService cache = MemcacheServiceFactory.getMemcacheService();
Después del despliegue, esto es lo que examino (a través de mis registros de la aplicación):
- La solicitud inicial es servido por un nodo en particular, y los datos se almacenan en la memoria caché recuperada anteriormente.
- Las nuevas solicitudes recuperan este mismo caché y los datos están allí.
- Cuando se genera un nuevo nodo para atender una solicitud (de los registros sé cuando esto sucede porque GAE registra el hecho de que "Esta solicitud provocó que se inicie un nuevo proceso para su aplicación ..."), se recupera la caché y está VACÍO !!
Ahora también sé que no hay garantía de cuánto tiempo estarán los datos en Memcache, pero de mis hallazgos parece que los datos desaparecen en el momento en que una instancia de diff intenta acceder al caché. Esto parece ir en contra de todo el concepto de un caché global distribuido, ¿no?
Esperemos que alguien pueda aclarar exactamente cómo esto DEBERÍA comportarse. Si no se supone que Memcache debe ser global y cada instancia de servidor tiene su propia copia, ¿por qué utilizar Memcache? Podría simplemente usar un HashMap estático (que inicialmente lo hice hasta que me di cuenta de que no sería global debido a las diferentes instancias que atendían mis solicitudes).
¿Ayuda?
¿Puede mostrarnos el código que está poniendo y recuperando los valores de Memcache? –
Parece probable que la memoria caché expulsada y su aplicación generada en una nueva instancia sean simplemente una coincidencia; ambas ocurrirían después de un período de inactividad, por ejemplo. Definitivamente no hay un enlace directo entre Memcache y las instancias de la aplicación. –
Encontré el problema y lo puse en funcionamiento. Inicialmente estaba usando la API de JCache y no pude hacer que funcionara, así que cambié a la API de Memcache de bajo nivel, pero olvidé eliminar el código JCache anterior. Entonces las dos implementaciones se pisaron una a la otra. No estoy seguro de por qué la implementación de JCache no funcionó, así que compartiré el código. –