RabbitMQ中的消费者选择

时间:2019-09-04 17:41:55

标签: rabbitmq

我有一个通过RabbitMQ发送消息的系统。消息包含订单ID。

接收系统在其数据库中查找订单ID是否存在。如果没有,则将其插入。如果是这样,那么它将对其进行更新。看起来像这样:

var doesOrderIdExistInDb = context.CheckIfOrderIdExists(order.OrderId);

if (doesOrderIdExistInDb)
{
    UpdateOrder(order);
} else 
{
    InsertOrder(order);
}

我遇到的问题是,对于一个订单ID,我可以连续接收多条消息。

当这些消息在使用者之间分割时,它们都同时执行上述检查和代码。意思是他们都检查订单ID是否存在(不存在),然后他们都尝试插入订单(除了一个失败之外,其他都失败)。

我需要某种方式来获取所有消息,以便订单ID发送给单个消费者。

如果有某种方法可以选择消费者,这将很容易。 (我可以使用工人的数量对订单ID进行取模运算。由于订单ID是顺序的,因此它将在消费者之间正常分配。)

我要避免的是必须创建一个新队列以发送给每个消费者。我的消费者应该有弹性(随着我的负担增加,人数也在增加)。

是否可以将我所有的订单ID发送给同一个消费者?(除了为每个消费者创建新的队列)。

1 个答案:

答案 0 :(得分:0)

队列中的消息由下一个可用使用者使用。 RabbitMQ服务器无法根据您的想法决定将下一条消息传递给下一个可用的使用者。

但是,消费者可以决定哪些邮件路由到他们接受和拒绝。

其他数据以完成此工作:

  • 每个消费者都必须记录他感兴趣的订单。
  • odder的第一条消息必须具有将其标识为第一条消息的属性。

如果有邮件发送给消费者,他将按照以下步骤操作:

  • 如果消息是订单的第一条消息,则消费者接受。它记录了它正在处理此订单的事实。
  • 其他,
    • 如果消费者已记录正在处理该消息所属的订单,则他接受该消息,
    • 否则,他拒绝。该邮件将重新排队。

这将确保一旦某个消费者开始处理订单的第一条消息,其他任何消费者都将不会处理该订单的消息。