AMQP / RabbitMQ - 如何避免竞争条件

时间:2016-05-23 14:29:29

标签: rabbitmq amqp race-condition

我有以下架构: Architecture

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

输入源正在发送要处理的命令。这些命令由代理转发,并由两个消费者中的一个接收。

我需要以下行为:

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

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

2 个答案:

答案 0 :(得分:0)

您可以使用每个队列的一个使用者来覆盖您的场景。 每个队列都可以按顺序处理消息。

另一种方法是只使用一个队列并使用envelope.getExchange()来理解来源,或使用tag

使用AMQP.BasicProperties properties您的消息

通过这种方式,您可以在多线程中使用消息,并为每个tag分配一个线程

答案 1 :(得分:0)

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