如何保证 RabbitMQ 中具有多个消费者的队列的任务顺序处理?
How do I guarantee task order processing for a queue with multiple consumers in RabbitMQ?
说我想开始A和B之间的友谊。
说我要结束A和B之间的友谊
这是我要发送到具有多个消费者(工作人员)的队列的两个任务。
我想保证处理顺序那么,如何避免第二个任务先于第一个任务执行?
我的解决方案:使任务粘性(关于A的任务总是发送给同一个消费者)。
实施:使用 RabbitMQ 的 exchanges 并将任务映射到可用的消费者。
如何将 A 映射到它的消费者?我在考虑 nginx 的 ip_hash。我想我需要类似的东西。
我不知道它是否相关,但 A 和 B 是 uuid.v4()
UUID。
你能指出我完成映射所需的算法吗?
嗯,有两个选择:
- 为所有事件创建一个交换器/队列,并保证它们将按正确的顺序插入。为他们创建一名工人。这会在插入数据时花费更多(并且不会为您提供可扩展性选项)。
- 为这种情况准备您的应用程序,例如当你收到消息 destroyFriendship 和友谊不存在时 - 将消息保存到包含未来友谊结束的数据库。然后你可以让多个工人建立和破坏友谊,而不必关心适当的秩序。简单地做你的工作,交朋友,如果数据库中有关于结束友谊的行 - 销毁它(或者根本不创建)。当然你需要检查 creation/destroying 时间的时间戳,并检查销毁时间是否在创建时间之后!
当然,您可以以某种方式计算 A/B 的哈希值,但在我看来,这比准备应用程序的成本更高。使用 excahnges/queues 缩放应用程序并不是很好 - 您将创建越来越多的队列,并且它最终会在 rabbitmq 中出现太多 queues/exchanges。
如果您必须使用您指定的解决方案 - 例如,您可以从 A 和 B 计算 crc32,并使用它的值计算应该将任务发送到哪个队列。但是这里有多个消费者可能会导致错误 - 如果其中一个消费者以某种方式被阻止并且其他消费者收到破坏友谊的消息怎么办?使用这个解决方案我会说每组 A/B.
有超过 1 个工人是危险的
说我想开始A和B之间的友谊。
说我要结束A和B之间的友谊
这是我要发送到具有多个消费者(工作人员)的队列的两个任务。
我想保证处理顺序那么,如何避免第二个任务先于第一个任务执行?
我的解决方案:使任务粘性(关于A的任务总是发送给同一个消费者)。
实施:使用 RabbitMQ 的 exchanges 并将任务映射到可用的消费者。
如何将 A 映射到它的消费者?我在考虑 nginx 的 ip_hash。我想我需要类似的东西。
我不知道它是否相关,但 A 和 B 是 uuid.v4()
UUID。
你能指出我完成映射所需的算法吗?
嗯,有两个选择:
- 为所有事件创建一个交换器/队列,并保证它们将按正确的顺序插入。为他们创建一名工人。这会在插入数据时花费更多(并且不会为您提供可扩展性选项)。
- 为这种情况准备您的应用程序,例如当你收到消息 destroyFriendship 和友谊不存在时 - 将消息保存到包含未来友谊结束的数据库。然后你可以让多个工人建立和破坏友谊,而不必关心适当的秩序。简单地做你的工作,交朋友,如果数据库中有关于结束友谊的行 - 销毁它(或者根本不创建)。当然你需要检查 creation/destroying 时间的时间戳,并检查销毁时间是否在创建时间之后!
当然,您可以以某种方式计算 A/B 的哈希值,但在我看来,这比准备应用程序的成本更高。使用 excahnges/queues 缩放应用程序并不是很好 - 您将创建越来越多的队列,并且它最终会在 rabbitmq 中出现太多 queues/exchanges。
如果您必须使用您指定的解决方案 - 例如,您可以从 A 和 B 计算 crc32,并使用它的值计算应该将任务发送到哪个队列。但是这里有多个消费者可能会导致错误 - 如果其中一个消费者以某种方式被阻止并且其他消费者收到破坏友谊的消息怎么办?使用这个解决方案我会说每组 A/B.
有超过 1 个工人是危险的