【问题标题】:RabbitMQ 2 QueuesRabbitMQ 2 队列
【发布时间】:2020-01-22 21:43:12
【问题描述】:

看到类似的问题,但预期的答案不同。我的问题是我可以创建一个消费者专注于单个队列,直到它清空然后切换到另一个队列,直到新的工作被发送到他们的主队列?

例如:1 个队列包含要在较长时间内处理的大量工作及其自己的专用消费者(例如 3 个)。第二个队列接收的工作更少,需要更少的处理。如果第二个队列的消费者完成了他们的工作,我是否可以让他们切换到第一个队列,直到他们的队列收到更多工作?

【问题讨论】:

    标签: rabbitmq message-queue priority-queue


    【解决方案1】:

    我认为对于这个问题,重要的是要记住规范意义上的“消费者”与 RabbitMQ 意义上的“消费者”之间存在差异。

    RabbitMQ 消费者 是该协议的一个发明 - 基本上,它指定通道/连接希望在指定的消费者标签下将消息推送到它。从这个意义上说,它只是通知代理立即发送消息。

    在规范意义上,消息消费者是处理消息的任何代码。

    因此,您的问题的答案是“是的,继续编写程序来做到这一点。”您可以控制规范的消费者代码。由您的软件决定如何处理来自队列的消息。

    现在,如果您想知道 RabbitMQ 是否可以将消费者重新订阅到不同的队列,答案是“它不是这样工作的”。在 RabbitMQ 中,消费者只是对订阅队列请求的响应——它是一个“消费者标签”对象。订阅的持续性质与通道/连接对相关。

    你应该怎么做?虽然你的代码没有指定任何特定的编码语言,但在我看来,你甚至问这个问题都偏离了轨道。订阅两个队列。如果工人无事可做,我认为计算机会对此非常满意。如果您担心一个特别繁忙的队列会发出过多的工作,您可以使用多种技术来限制进入该消费者的消息。一种流行的技术是prefetch

    【讨论】:

    • 关于澄清的好点。我应该做什么我很困惑为什么语言很重要(java fyi),但听起来 RabbitMQ 本身无法进行这种配置。当一个队列清空到另一个队列时,我可以以编程方式切换消费者。我希望有一种内置的方式可以从多个中消费。不过,在您提出预取之前,似乎确实有些混乱。不担心消费者负担过重。只是想提高效率。
    • 感谢您的回答,看来“不”基本上是对的
    • 我认为您可能有点过度架构...只需将消息转储到您的处理器中。我个人更喜欢按消息类型隔离队列,因此从逻辑上讲,使用相同类型的消息有多个不同的队列是没有意义的。
    • 它还与消息的SLA有关。一个队列的数量很大,SLA 不受限制,而另一个队列的数量要小得多,几乎是即时的 SLA。
    • 没有什么能阻止您的其他工作人员在其他队列上执行 basic.get。