2016-05-23 224 views
4

我有以下结构: ArchitectureAMQP/RabbitMQ的 - 如何避免竞争条件

  • 有输入源的固定数量。每个输入源都是等效的。
  • AMQP经纪人。我在使用RabbitMQ。
  • 目前,有2个消费者。同样,每个消费者都是相同的。

输入源正在发送要处理的命令。这些命令由经纪人转发,并由两位消费者中的一位提取。

我需要以下行为:

  • 如果一个输入源发送多个命令,所有命令必须被顺序地处理。也就是说,在2个命令的示例中,当消费者2同时处理命令2时,消费者1正在处理命令1的是不允许
  • 但是,可以同时处理源自两个不同输入源的两个命令。

是否可以用AMQP/RabbitMQ强制执行此行为?

回答

0

您可以为每个队列使用一位消费者来覆盖您的方案。 每个队列都可以按顺序处理消息。

另一种方式是仅使用一个队列,并使用envelope.getExchange()了解源,或tag使用AMQP.BasicProperties properties

这样你的消息,例如,你可以消耗多线程的消息和分配每个线程一个线程tag

+0

我不太确定这是否解决了我的问题。这可以防止消费者同时收到多条消息。然而,我可能在这里是错的,这并不妨碍另一位消费者收到来自第一位消费者目前正在处理的来自同一输入源的消息? – TheRabbitHopper

+0

这取决于你作为'broker'的意思,你把所有的信息放在同一个队列中吗? – Gabriele

+0

所有消息放在同一队列中。我应该为每个输入源创建一个队列吗?这意味着每个消费者都在倾听所有队列? – TheRabbitHopper

0

为了保证顺序,您可能需要聚合消息。在发布到队列之前,您可以将来自一个源的命令批量处理为消息,因此消息进入队列可以包含一个或多个将由消费者执行的命令。

+1

我无法在发布前批量/收集消息。每条消息应尽快处理。 – TheRabbitHopper