¿Cómo procesas los mensajes en paralelo mientras garantizas FIFO por entidad?

Digamos que tiene una entidad, por ejemplo, "Persona" en su sistema y desea procesar eventos que modifiquen varias entidades Persona. Es importante que

Los eventos para la misma Persona se procesan en orden FIFO Las secuencias de eventos de múltiples personas se procesan en paralelo por diferentes subprocesos / procesos

Tenemos una implementación que resuelve esto usando una base de datos compartida y bloqueos. Los subprocesos compiten para adquirir el bloqueo para una Persona y luego procesan los eventos en orden después de adquirir el bloqueo. Nos gustaría pasar a una cola de mensajes para evitar sondeos y bloqueos, lo que creemos que reduciría la carga en la base de datos y simplificaría la implementación del código del consumidor.

He realizado algunas investigaciones sobre ActiveMQ, RabbitMQ y HornetQ, pero no veo una forma obvia de implementar esto.

ActiveMQ admite comodines de suscripción al consumidor, pero no veo una forma de limitar la concurrencia en cada cola a 1. Si pudiera hacer eso, entonces la solución sería sencilla:

De alguna manera, dígale al agente que permita una concurrencia de 1 para todas las colas que comienzan con: /queue/personPublisher escribe el evento en la cola usando la ID de persona en el nombre de la cola. por ejemplo: /queue/person.2 Los consumidores se suscriben a la cola con comodines: /queue/person.> Cada consumidor recibiría mensajes para diferentes colas de personas. Si todas las colas de personas estuvieran en uso, algunos consumidores podrían permanecer inactivos, lo cual está bienDespués de procesar un mensaje, el consumidor envía un ACK, que le dice al agente que ha terminado con el mensaje y permite que otro mensaje para la cola de esa Persona se envíe a otro consumidor (posiblemente el mismo)

ActiveMQ estuvo cerca: puede hacer suscripciones con comodines y habilitar "consumidor exclusivo", pero esa combinación da como resultado que un solo consumidor reciba todos los mensajes enviados a todas las colas coincidentes, reduciendo su concurrencia a 1 en todas las Personas. Siento que me falta algo obvio.

Preguntas:

¿Hay alguna manera de implementar el enfoque anterior con alguna implementación importante de la cola de mensajes? Estamos bastante abiertos a las opciones. El único requisito es que se ejecute en Linux.Existe una forma diferente de resolver el problema general que no estoy considerando?

¡Gracias

Respuestas a la pregunta(3)

Su respuesta a la pregunta