gpt4 book ai didi

rabbitmq - 使用 RabbitMQ 进行分布式通信和处理

转载 作者:行者123 更新时间:2023-12-04 08:28:28 25 4
gpt4 key购买 nike

我目前正在重新设计一个系统,遇到了一些困难。

要求

我有一个消息队列(一个 RabbitMQ 队列)和一些从该队列中消费的服务。每条消息都有一个 id 表示它是组的一部分,还有一个时间戳来帮助表示顺序。

从队列中消费的每个服务至少负责处理一组,但也可以负责多组。服务可以跨多个服务器运行。

系统必须允许可变数量的消费服务,并允许在服务初始化/销毁时自动重新分配 ID。

消息必须实时处理,不允许缓冲。消息必须在其 ID 组内按顺序处理。


问题/限制

Rabbit 不允许在获取之前遍历队列,或者基于模式从单个队列中获取。

消息中的顺序很重要。虽然我们可以简单地获取排名靠前的消息并在它们与我们的 ID 不匹配时拒绝它们,但这会引入一个问题

为了强制执行顺序处理,我们需要将预取计数值设置为 1。然而,这引入了活锁的可能性,其中服务不断获得队列的头部,但没有服务获得消息它可以处理,或者很少会严重影响性能。

相反,如果我们将预取计数设置得足够高以合理地缓解这种情况,它会允许乱序处理。

无论哪种情况,将预取计数设置为较低的值似乎都会严重影响性能。


可能的解决方案

多个兔子队列

为每个消费者自动生成一个兔子队列并使用 topic exchanges自动路由消息似乎是一种可能的解决方案。

然而,这会产生一个问题,即如果我们需要在处理该服务的队列之前减少使用服务的数量,消息将会丢失。如果服务终止并且无法重新启动替代服务,也会导致消息丢失。

协调员/ worker

我目前的想法是有一个协调器服务,它从队列中读取并根据 id 将消息分发给工作人员。

虽然这会引入单点故障,但可以创建多个协调器进程,这些进程将通过 zookeeper 传达哪个工作人员负责给定的 ID。 .

这将需要以下模式之一;

  • 推送:每个协调员都会维护一份所有工作人员的列表,并在他们进来时推送消息。
  • 全局拉动:每个工作人员将轮询所有协调器以获取消息并在本地对它们进行排序和处理,
  • 本地拉动:工作人员将保持与单个协调器的连接,协调器将在它们之间传递消息。

问题

  1. Master/Worker 模型是解决这个问题的可行方案吗?如果是这样;
    • 协调器如何跨服务器与工作器通信? (同时避免了如上所述的多兔子队列问题)
    • 同样,如果我们使用前面概述的本地拉取方法,协调器如何在彼此之间传递消息。
  2. 还有其他我忽略的解决方案吗?

非常感谢任何帮助

最佳答案

对于这个问题,这可能不是正确的 Stack Exchange,但我会通过纠正您的几件事来尝试一下。

In order to enforce in-order processing, we need to set the prefetch count value to 1. However this introduces the possibility of a livelock, where the services are constantly getting the head of the queue, but no service gets a message which it can process, or so rarely as to heavily impact performance.

我不明白这个问题...只有服务可以处理所有消息时,它们才会订阅队列。也只绑定(bind)队列可以处理的路由键。

In either case setting the prefetch count to a low value seems to heavily impact performance.

基本上预取计数应该等于工作人员的数量,否则您将获得很少的 yield 。问题是你不能在没有松散顺序的情况下做两件事(即并行运行的多个工作)。

因此,多个并行工作器会丢失顺序,而不是预取计数。

It will also result in lost messages if a service dies and no replacement can be restarted.

不,这不应该发生。如果您的服务没有ack 消息,则消息不会丢失。只是不要删除队列并使它们持久化。但是,如果您动态添加队列和绑定(bind),我认为这是您想要说的,那么如果未及时声明绑定(bind)(路由 key ),您可能会丢失消息。 You can deal with this issue with a dead letter exchange .

您的一般问题是我认为您希望能够将工作人员添加到队列中并仍然保持秩序。这是一个很难大规模解决的问题。 You should look into how Twitter does this.

有几个想法可以弄清楚您可以对什么进行“散列”以及可以对什么进行排队。例如,您可以为某个地理区域的所有用户排队,从而为该区域的人们保持秩序。这实际上取决于您的业务问题。

关于rabbitmq - 使用 RabbitMQ 进行分布式通信和处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15487931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com