2009-07-28 9 views
42

¿Cuál es la mejor estrategia para refactorizar un objeto Singleton a un entorno de clúster?Singleton en entorno de clúster

Usamos Singleton para almacenar en caché alguna información personalizada de la base de datos. Es principalmente de solo lectura pero se actualiza cuando se produce un evento en particular.

Ahora nuestra aplicación debe implementarse en un entorno en clúster. Por definición, cada JVM tendrá su propia instancia de Singleton. Por lo tanto, la memoria caché puede estar desincronizada entre las JVM cuando se produce un evento de actualización en un solo nodo y se actualiza su caché.

¿Cuál es la mejor manera de mantener el caché sincronizado?

Gracias.

Editar: La memoria caché se utiliza principalmente para proporcionar una lista de autocompletar (por motivos de rendimiento) a la interfaz de usuario y usamos Websphere. Así que cualquier sugerencia relacionada con Websphere es bienvenida.

Respuesta

9

Los enfoques más simples son:

  1. Añadir un temporizador de caducidad de la memoria caché de manera que cada producto único llamadas tan a menudo la memoria caché se purga y se subsquent obtener los datos actualizados de la fuente (por ejemplo,una base de datos)

  2. Implemente un mecanismo de notificación para la memoria caché utilizando algo así como un tema JMS/tibRV. Obtenga cada instancia de caché para suscribirse y reaccionar a cualquier mensaje de cambio emitido sobre este tema.

+0

¿Puedes elaborar en 2? ¿Te refieres al modelo JMS pub/subscribe? – lud0h

+0

Sí solución 2 es esencialmente una forma de utilizar un mecanismo pub/sub para la difusión de cambios en las instancias de caché individuales. Debería crear un tema JMS que se ejecute en el servidor de aplicaciones al que está suscrito cada uno de los cachés. Cuando los datos cambian, un mensaje debe ser publicado en el tema. Cada suscriptor recibiría este mensaje y actualizaría los cachés locales en consecuencia. – pjp

+0

Si sus datos no cambian muy a menudo, entonces elegiría la opción 1. He trabajado en varios sistemas usando este enfoque para refrescar los datos de referencia. Creo que solíamos actualizar los cachés cada 30 minutos. El período de actualización que elija obviamente se basará en cómo se utilizan sus datos de referencia. – pjp

16

Reemplace su caché de singleton con una caché distribuida.

Una de estas cachés podría ser JBoss Infinispan, pero estoy seguro de que existen otras tecnologías de caché y cuadrícula distribuidas, incluidas las comerciales, que probablemente sean más maduras en este momento.

Para objetos singleton en general, no estoy seguro. Creo que trataría de no tener singletons en primer lugar.

+0

He encontrado que el más simple (subjetivamente) para implementar parece ser 'ehcache'. –

1

Si es posible, use el soporte de su servidor de aplicaciones para esto, si es posible (algunos lo tienen, otros no). Por ejemplo, usamos el soporte de JBoss para un "HA Singleton", que es un servicio que solo se ejecuta en el nodo maestro del clúster. No es perfecto (tienes que manejar el caso donde ocasionalmente se te cae el cerebro), pero es lo suficientemente bueno.

De lo contrario, puede diseñar algo utilizando JGroups, que proporciona la detección y negociación automática de nodos de clúster, pero no es trivial.

Como último recurso, puede usar el bloqueo de la base de datos para administrar los singleton del clúster, pero eso es en serio frágil. No recomendado.

Como alternativa a un clúster singleton, puede usar un caché distribuido en su lugar. Recomiendo JBossCache (que no necesita ejecutar el servidor de aplicaciones JBoss) o EhCache (que ahora proporciona un mecanismo de distribución). Tendrá que rediseñar su caché para que funcione de forma distribuida (no funcionará mágicamente), pero probablemente sea una mejor solución que un cluster singleton.

1

Estoy con el Sr. Vest Hansen en este caso, aléjese lo más posible de los singletons. Después de estar plagado de la pesadilla que es SAAJ y JAXP y obtener versiones compatibles trabajando en JBoss, he terminado con singletons y fábricas. Un mensaje SOAP no debería necesitar una fábrica para instanciarlo.

Bien, despotricar, ¿qué pasa con Memcache o algo similar? ¿Qué tipo de afinidad necesitas para tu caché? ¿Es malo si está SIEMPRE desactualizado, o hay alguna flexibilidad en la desactualización de los datos?

+0

Lo usamos para una lista de autocompletar, por lo que los usuarios no verán los cambios. Gracias por tus comentarios. – lud0h

4

O algo así como memcached

http://www.danga.com/memcached/

Lo que se memcached? memcached es un alto rendimiento, memoria distribuida sistema de caché de objetos, genérico en la naturaleza , pero previsto para su uso en aligerando las aplicaciones web dinámicas aliviando la carga de la base de datos.

Danga interactivo desarrollado memcached para mejorar la velocidad de LiveJournal.com, un sitio que estaba haciendo ya 20 millones + dinámica página vistas por día por 1 millón de usuarios con un grupo de servidores web y un grupo de base de datos servidores. memcached cayó la carga de la base de datos a casi nada, rindiendo tiempos de carga de página más rápidos para usuarios, mejor utilización de recursos, y un acceso más rápido a las bases de datos en una falla memcache.

1

Existen varias maneras de manejar esto, dependiendo de 1) qué tan fuera de datos están los datos, y 2) cada instancia necesita tener los mismos valores todo el tiempo.

Si solo necesita datos que sean razonablemente correctos, pero no es necesario que cada JVM tenga datos coincidentes, puede hacer que cada jvm actualice sus datos en la misma programación (por ejemplo, cada 30 segundos).

Si la actualización tiene que ocurrir más o menos al mismo tiempo, puede tener una JVM enviar un mensaje al resto de ellos diciendo "es el momento de actualizar ahora"

Si cada JVM necesita siempre la misma información , necesita hacer una sincronización, donde el maestro dice "actualizar ahora", todos los cachés bloquean las consultas nuevas, actualizan y le dicen al maestro que ya terminaron. Cuando el maestro obtiene una respuesta de cada miembro del clúster, envía otro mensaje que dice que continúe.

+0

Cada instancia necesita algunos datos, de lo contrario, los usuarios no verán nuevos cambios. ¿Puedes elaborar un poco más para mantener las JVM sincronizadas? ¿Qué tipo de sub/notificación disponible? Gracias. – lud0h

+1

^Cada instancia necesita algunos datos^-> Cada instancia necesita * mismo * datos – lud0h

+0

1, ¿Puede explicar cómo le está diciendo a otra JVM que actualice? ¿Estás usando el enfoque pub/sub? 2, ¿Y si necesita actualizar los datos sin demora? es decir, si un hilo en JVM1 está actualizando los datos y ese próximo minuto JVM2 necesita esos datos. cómo manejar esta situación –

0

Hay productos para tener una caché de memoria distribuida (como Memcache) que puede ayudar en esta situación.

Una mejor solución, si es posible, puede ser que los singletons no sean realmente únicos, pero que la aplicación tolere tener instancias separadas (digamos que todos reconocen cuándo deben actualizarse) pero no que tengan que estar en sincronizar a través de JVM, que puede convertir su caché en un cuello de botella.

+0

Sí, la parte del truco es "que todos reconocen cuándo necesitan ser actualizados" ... JMS necesita un proveedor de mensajería, parece que RMI puede ser la única opción. ¿Alguna otra idea? (excepto jGroups/Terracota) y así sucesivamente ... es decir. sin dependencias externas? – lud0h

8

Puede usar el DistributedMap que está incorporado en WAS.

-Rick

+0

Gracias por el enlace. Parece que puede ser mucho más sencillo de configurar y usar que JMS. – lud0h

+0

el enlace parece estar muerto hoy en día ... –

1

estoy frente a una situación similar, pero estoy usando de Oracle WebLogic y coherencia.

estoy trabajando sobre una aplicación web que utiliza un mapa hash con los datos almacenados en caché se leen de la base de datos (texto a mostrar en el formulario web 's etiquetas). Para lograr esto, los desarrolladores usaron una instancia única donde almacenaron toda esta información. Esto funcionó bien en un entorno de servidor único, pero ahora queremos ir a la solución de clúster y estoy enfrentando este problema con esta instancia de singleton.

De lo que he leído hasta ahora, this is the best solution to accomplish what I want. Espero que esto te ayude con tu problema, también.

+0

El enlace de arriba no está funcionando. ¿puedes compartir este concepto? –