Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RabbitMQ中的消费者选择_Rabbitmq - Fatal编程技术网

RabbitMQ中的消费者选择

RabbitMQ中的消费者选择,rabbitmq,Rabbitmq,我有一个通过RabbitMQ发送消息的系统。这些消息包含订单ID 接收系统在其数据库中查找订单ID是否存在。如果没有,则将其插入。如果有,则会进行更新。看起来是这样的: var doesOrderIdExistInDb = context.CheckIfOrderIdExists(order.OrderId); if (doesOrderIdExistInDb) { UpdateOrder(order); } else { InsertOrder(order); } 我的问

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

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

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

if (doesOrderIdExistInDb)
{
    UpdateOrder(order);
} else 
{
    InsertOrder(order);
}
我的问题是,对于一个订单ID,我可以在一行中包含多条消息

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

我需要一些方法来获取订单ID的所有消息,以便发送给单个消费者

如果有某种方法来选择消费者,这将很容易。(我可以使用工人数量对订单ID进行模运算。因为订单ID是连续的,所以它通常会在消费者之间分布。)

我想要避免的是必须为每个消费者创建一个新的队列来发送。我的消费者应该是有弹性的(随着我的负载增长,数量也会增加)


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

队列中的消息将被下一个可用消费者使用。RabbitMQ服务器无法决定不以您所想到的方式将下一条消息传递给下一个可用的使用者

但是消费者可以决定他们接受哪些消息,拒绝哪些消息

其他数据实现此功能:

  • 每个消费者都必须记录他感兴趣的订单
  • 订单的第一条消息必须具有将其标识为第一条消息的属性
如果消息被路由到消费者,消费者将执行以下步骤:

  • 如果消息是订单的第一条,则消费者接受它。它记录了它正在处理此订单的事实
  • 否则,,
    • 如果消费者已记录其正在处理消息所属的订单,则他接受消息
    • 否则,他会拒绝它。该消息将被重新查询
这将保证一旦消费者开始处理订单的第一条消息,其他消费者就不会处理属于该订单的消息