【问题标题】:RabbitMQ fan out on a topic exchangeRabbitMQ 在主题交流中展开
【发布时间】:2011-07-12 07:59:09
【问题描述】:

对 RabbitMQ 来说还是个新手,我们仍处于调查阶段,看看它是否适合我们的用例--

我们很容易得出结论,我们想要的拓扑结构会让我们部署一些基于主题的交换,然后从那里过滤到特定的队列。例如,假设我们有一个用户和一个上传交换,其中用户队列可能会收到主题为“新注册”或“朋友请求”的消息,而上传交换可能会收到诸如“视频上传”或“图片上传”。

创建队列,将它们路由到适当的队列,然后构建侦听器来处理各种队列的消息非常简单。

但我不清楚是否可以在主题交换中进行扇出?

即我已经命名了绑定到我的主题交换的队列,但我希望能够在这些队列中抛出大量我的侦听器实例,以防止单点故障。但据我所知,RabbitMQ 以直截了当的循环方式对待这些听众——例如。每第 N 个消息总是发送到同一个第 N 个侦听器,而不是将消息分派给第一个可用的消费者。这对我们来说通常是可以接受的,但考虑到我们预期的负载,我们希望避免在我们的消费者农场中出现热点的可能性。

那么,是否有某种方式,无论是在队列或交换配置中还是在消费者代码中,我们可以将我们的侦听器指向一个主题队列,但让侦听器以扇出方式处理?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    我不知道事实,但我强烈怀疑 RabbitMQ 会跳过带有未确认消息的消费者,因此它不应该成为单个卡住消费者的瓶颈。他们FAQ 上的 cmets 似乎表明 RabbitMQ 会努力让事情保持平稳,即使在遇到麻烦的消费者的情况下也是如此。

    【讨论】:

      【解决方案2】:

      是的,通过让侦听器使用不同的队列名称进行绑定,它们将以扇出方式处理。

      虽然扇出是 1:N,即每个任务都可以交付给多个侦听器,例如 pub-sub。请注意,这不仅限于扇出交换,还适用于使用相同绑定键将多个队列绑定到直接或主题交换的情况。 (安装管理插件并查看那里的交换可能有助于可视化有效的绑定。)

      您当前的设置是一个任务队列。每个任务/消息都准确地传递给一个工作人员/侦听器。以相同的队列名称抛出更多侦听器,它们将按照您所说的循环处理任务。使用“扇出”(主题的单独队列),您将多次处理任务。

      根据您的平台,可能存在满足您要求的现有工作队列解决方案,例如适用于 Ruby 的 Resque 或 DelayedJob、适用于 Python 的 Celery,或者适用于 JVM 的 Octobot 或 Akka。

      【讨论】:

        【解决方案3】:

        这是一个迟到的答案,但如果其他人遇到这个问题...... 听起来您想要的是公平调度而不是扇出模型(它将给定消息发布到每个队列)。

        公平调度将向下一个可用的工作人员发送消息,而不是使用简单的循环方法。这应该避免您担心的“热点”,而不会将相同的消息传递给多个消费者。

        如果这是您正在寻找的内容,请参阅 Rabbit 文档中this page 上的“公平调度”部分。 prefetch 计数为 1 是这里的关键。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          • 2021-11-28
          • 2014-08-01
          • 1970-01-01
          • 2012-06-30
          相关资源
          最近更新 更多