如何保证RabbitMQ中具有多个使用者的队列的任务顺序处理?

时间:2016-09-27 08:05:15

标签: nginx hash rabbitmq uuid

说我想在A和B之间建立友谊。

说我想结束A和B之间的友谊。

这是我要发送到具有多个消费者(工作人员)的队列的两个任务。

我想保证处理顺序那么,如何避免第一个任务在第一个之前执行?

我的解决方案:让任务粘性(关于A的任务总是发送给同一个消费者)。

实施:使用RabbitMQ的交换并将任务映射到可用的消费者。

如何将A映射到其消费者?我正在考虑nginx的ip_hash。我想我需要类似的东西。

我不知道它是否相关,但A和B是uuid.v4() UUID。

你能指出我需要完成映射的算法吗?

1 个答案:

答案 0 :(得分:0)

嗯,有两种选择:

  1. 为所有活动制作一个交换/队列,并保证它们将以正确的顺序插入。为他们创建一个工人。这在插入数据上花费更多(并且没有为您提供可伸缩性选项)。
  2. 为此类情况准备您的应用,例如当你收到消息destroyFriendship和友谊不存在时 - 将消息保存到包含未来友谊结束的db。然后你可以让多个工人制造和破坏友谊,而不必关心正确的秩序。简单地完成你的工作,交朋友,如果在db中有关于友谊结束的行 - 摧毁它(或者根本就不创建)。当然,您需要检查创建/销毁时间的时间戳,并检查销毁时间是否在创建时间之后!
  3. 当然你可以计算一下A / B的哈希值,但是IMO会比预备app更费力。使用excahnges / queues的scalling app并不是很好 - 您将创建越来越多的队列,并且它将在rabbitmq中以太多的队列/交换结束。

    如果你必须使用你指定的解决方案 - 你可以例如从A和B计算crc32,并使用它的值calcalate到哪个队列任务应该发送。但是,拥有多个消费者可能会在这里造成错误 - 如果其中一个消费者被某种方式阻止而其他消费者会因破坏友谊而收到消息呢?使用这个解决方案,我说每组A / B超过1名工人是危险的。