2009-04-03 59 views
5

Tengo un problema donde necesito sincronizar el procesamiento de varios subprocesos en varios servidores diferentes para un servicio de Java en Windows.Java: sincronización de subprocesos en varios servidores

En esta aplicación, tengo varios hilos de consumo retirando mensajes de la misma cola JMS. Los mensajes vienen en grupos de 3 o 4, y necesito asegurarme de que los mensajes en cada grupo se procesen completamente en serie. Necesito algún tipo de mecanismo de sincronización para asegurarme de que thread1 desconecta un mensaje, luego thread2 saca el siguiente mensaje de ese grupo, thread2 espera que thread1 termine de procesar antes de comenzar a procesar su mensaje.

¿Alguna sugerencia sobre mecanismos distribuidos de sincronización para hilos? Cualquier tipo de solución sería buena (soluciones JMS, almacenamiento en caché distribuido, etc.)

Nota: el proveedor de JMS que estamos utilizando es ActiveMQ.

Respuesta

7

ActiveMQ tiene soporte para message groups que, literalmente, debería ser exactamente lo que necesita.

+0

He mirado en los que brevemente. ¿Sabes qué sucede con los grupos de mensajes si continuamente creas grupos nuevos? ¿El hash interno crecerá continuamente? ¿Hay alguna manera de "eliminar" o "caducar" un grupo, para que el grupo no se quede sentado en la memoria para siempre? Thx por la respuesta, por cierto. –

+0

Puede cerrar grupos de mensajes (se detalla en la página que he vinculado). Aunque no estoy seguro acerca de la sobrecarga de crear nuevos grupos, probablemente sea para comprobar cómo se hace directamente desde la fuente. – andri

1

¿Hay algo como una identificación de grupo en los encabezados de los mensajes? Si es así, un consumidor podría crear un Selector para procesar el grupo en secuencia.

La asignación de un grupo a un consumidor en particular se puede hacer mediante hash el identificador de grupo, o pueden coordinarse activamente utilizando algún protocolo de consenso como Paxos o sincronía virtual (con los mensajes enviados en una cola separada) .

+0

Cada grupo tiene un campo "ID de grupo", que se puede usar para agruparlos a todos. Sin embargo, esta ID de grupo proviene de una parte externa, por lo que los consumidores no conocerán la ID hasta que reciban el primer mensaje. –

+0

No estoy seguro si eso le da alguna información útil. Soy una especie de usuario intermedio de JMS, así que aún no he trabajado con selectores. –

7

es posible que desee considerar el uso de Hazelcast bloqueos distribuidos. Super lite, fácil y de código abierto.

java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor"); 
lock.lock(); 
try { 
// do your stuff 
}finally { 
    lock.unlock(); 
} 

Saludos,

-talip

Hazelcast - código abierto distribuido cola, mapa, Conjunto, Lista, bloqueo

Cuestiones relacionadas