Como você processa mensagens em paralelo enquanto garante FIFO por entidade?

Digamos que você tenha uma entidade, digamos, "Pessoa" em seu sistema e deseje processar eventos que modifiquem várias entidades de Pessoa. É importante que

Os eventos para a mesma pessoa são processados na ordem FIFO Fluxos de eventos de várias pessoas sejam processados em paralelo por diferentes threads / processos

Temos uma implementação que resolve isso usando um banco de dados compartilhado e bloqueios. Os encadeamentos competem para adquirir o bloqueio para uma Pessoa e depois processar os eventos em ordem após a aquisição do bloqueio. Gostaríamos de passar para uma fila de mensagens para evitar pesquisas e bloqueios, o que acreditamos reduziria a carga no banco de dados e simplificaria a implementação do código do consumido

Eu fiz algumas pesquisas no ActiveMQ, RabbitMQ e HornetQ, mas não vejo uma maneira óbvia de implementar iss

@ActiveMQ suporta curingas de assinatura do consumidor, mas não vejo uma maneira de limitar a simultaneidade em cada fila para 1. Se eu pudesse fazer isso, a solução seria simples:

Algum modo, diga ao broker para permitir uma simultaneidade de 1 para todas as filas começando com: /queue/person @Publisher grava o evento na fila usando o ID da pessoa no nome da fila. por exemplo: / fila / pessoa.2s @Consumers se inscrevem na fila usando caracteres curinga: /queue/person.> Cada consumidor receberia mensagens para diferentes filas de pessoas. Se todas as filas de pessoas estiverem em uso, alguns consumidores poderão ficar ociosos, o que é bompós o processamento de uma mensagem, o consumidor envia um ACK, informando ao broker que a mensagem foi concluída e permite que outra mensagem para essa fila de Pessoa seja enviada para outro consumidor (possivelmente o mesmo

@ActiveMQ chegou perto: você pode fazer assinaturas curinga e ativar "consumidor exclusivo", mas essa combinação resulta em um único consumidor recebendo todas as mensagens enviadas para todas as filas correspondentes, reduzindo sua simultaneidade para 1 em todas as pessoas. Sinto que estou perdendo algo óbvio.

Questões

Existe maneira de implementar a abordagem acima com qualquer implementação importante da fila de mensagens? Estamos bastante abertos a opções. O único requisito é que seja executado no Linux. Existe uma maneira diferente de resolver o problema geral que não estou considerand

Obrigado

questionAnswers(3)

yourAnswerToTheQuestion