RabbitMQ的分布式通信与处理

RabbitMQ的分布式通信与处理,rabbitmq,distributed-computing,apache-zookeeper,worker,Rabbitmq,Distributed Computing,Apache Zookeeper,Worker,我目前正在重新设计一个系统,遇到了一些麻烦 要求 我有一个消息队列(一个队列)和许多从该队列中消费的服务。每条消息都有一个id,表示它是组的一部分,还有一个时间戳,用来表示顺序 队列中使用的每个服务负责处理至少一个组,但也可以负责多个组。服务可以跨多个服务器运行 系统必须允许可变数量的消费服务,并允许在服务初始化/销毁时自动重新分配ID 消息必须实时处理,不允许缓冲。消息必须在其ID组内按顺序处理 问题/限制 Rabbit不允许在获取之前遍历队列,也不允许从基于模式的单个队列获取 在信息中,顺

我目前正在重新设计一个系统,遇到了一些麻烦

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

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

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

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


问题/限制 Rabbit不允许在获取之前遍历队列,也不允许从基于模式的单个队列获取

在信息中,顺序很重要。虽然我们可以简单地获取最重要的消息,如果它们与我们的id不匹配,就拒绝它们,但这会带来一个问题

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

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

在这两种情况下,将预取计数设置为较低的值似乎会严重影响性能


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

但是,如果我们需要在处理服务队列之前减少使用服务的数量,这会造成消息丢失的问题。如果某个服务死亡,并且无法重新启动任何替换,则还会导致消息丢失

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

虽然这会导致单点故障,但也可以创建多个协调进程,这些进程将通过以下方式告知哪个工作人员负责给定的id

这将需要以下模式之一:

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

问题
  • 主/工模式是解决这个问题的可行方案吗?若有,;
    • 协调员如何跨服务器与工作人员通信?(同时避免如上所述的多兔子队列问题)
    • 类似地,如果我们使用前面介绍的本地拉方法,那么协调器如何在彼此之间传递消息
  • 还有其他我忽略的解决方案吗

  • 非常感谢您提供的任何帮助

    对于这个问题,这可能不是正确的堆栈交换,但我将尝试纠正您的一些问题

    为了执行顺序处理,我们需要设置预取 计数值为1。然而,这引入了一种可能性 livelock,在这里,服务一直占据着市场的主导地位 队列,但没有服务获取它可以处理的消息,等等 很少会严重影响性能

    我不明白这个问题。。。只有当服务可以处理所有消息时,才允许服务订阅队列。此外,仅绑定队列可以处理的路由密钥

    在这两种情况下,将预取计数设置为较低的值似乎会严重影响性能

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

    因此,多个并行工作进程的订单丢失,而不是预取计数

    如果某个服务死亡,并且无法重新启动任何替换,则还会导致消息丢失

    不,这不应该发生。如果您的服务未确认信息,则信息不会丢失。只是不要删除队列并使其持久。但是,如果您动态添加队列和绑定(我认为这是您试图说的),那么如果绑定(路由密钥)没有及时声明,您可能会丢失消息

    您的一般问题是,我认为您希望能够将工人添加到队列中,并且仍然保持秩序。这是一个很难大规模解决的问题


    有两个想法是找出什么可以“散列”在上面,什么可以在上面生成队列。例如,您可以为某个地理区域中的所有用户建立一个队列,从而为这些区域中的用户保持秩序。这确实取决于您的业务问题。

    RabbitMQ重新查询保持队列中原始位置的消息:@old_听起来很有趣,我不知道这一点,谢谢链接。然而,我认为这个事实不能用来解决这个问题。为了消除无序消息的可能性,我们必须将预回迁计数设置为1或类似的低值。然而,这引入了livelock的可能性,这是不可接受的。我正在相应地更新这个问题。为什么严格的顺序很重要?订单是否需要全球化?无论您做出什么决定,都不应该通过一个队列发送系统能够生成的所有消息。也wh