【问题标题】:Is it possible to consume an exchange in RabbitMQ?是否可以在 RabbitMQ 中使用交换?
【发布时间】:2012-01-11 02:46:14
【问题描述】:

也许我在这里问错了问题。

我正在尝试做的事情:多个生产者将动态类别中的数据推送到命名交换中。多个消费者需要从这些动态命名的队列中获取这些数据并对其进行操作。

问题是我看到的所有消费示例都要求消费者/订阅具有特定的队列名称,而我的消费者不知道队列的名称,他们也不需要知道这一点。

我为什么要这样做?两个原因:

  1. 我一次可以拥有 N 个这些动态类别。我希望队列能够平等地为这些类别服务。目前我们有一个队列 (msmq),它接受所有这些类别并以 FIFO 的形式为它们提供服务(这意味着某些类别在一段时间内处于饥饿状态)。

  2. 能够平等地为所有类别提供服务,而不是先进先出,让我想出了有趣的 QoS(默认情况下,我知道 Rabbit 将循环提供消息)。

所以,回到我的问题(如果它有效的话):是否可以从队列中消费消息?

【问题讨论】:

    标签: .net rabbitmq message-queue amqp rabbitmq-exchange


    【解决方案1】:

    如果可以选择动态订阅者,我想提出两种可能的解决方案:

    解决方案 1:

    • 使用主题交换。
    • 在向您的交易所发布消息时使用强制传递标志。
    • 如果消息被拒绝:创建一个队列,为特定的路由键绑定它并在队列上启动一个订阅者,重新发布被拒绝的消息。
    • 使用自动删除队列,这样当订阅者停止时,他们的队列将消失,整个自动创建过程可以重新开始。

    解决方案 2:

    • 使用主题交换。
    • 在向您的交易所发布消息时使用 immediate 传递标志。
    • 如果消息被拒绝:创建一个队列,为特定的路由键绑定它并在队列上启动一个订阅者,重新发布被拒绝的消息。
    • 使用持久队列。由于队列创建是幂等的,因此可以通过重新创建过程,这里的基本部分是确保实时订阅者正在侦听队列。

    如果动态订阅者不是一个选项,那么这就是我的建议。假设您仅限于 n 个订阅者:

    • 定义一个策略,对 n 个路由键中的动态类别进行哈希处理,
    • 使用直接交换,
    • n 个路由键绑定 n 个队列,
    • 每个队列有一个订阅者。

    【讨论】:

    • 这些都是有趣的选项,我正在阅读更多关于主题交流的内容,但我的主要问题是我的订阅者是 a) 静态的(即他们不会旋转。他们总是在等待,如查克诺里斯),和b)我不希望我的订阅者知道队列。我希望他们平等地为我所有的队列服务
    • 抱歉我误会了。消息在队列中累积,因此您必须有队列。现在,如果您设想的设计是从无限数量的队列中拉出的一组有限的消费者,那么请阅读此处的讨论:stackoverflow.com/questions/8301841/…
    • 这个答案很好!但问题是,即使有一个队列和 n 个工作人员,他的一个客户也可以创建一千个任务,并且该队列现在被阻塞,直到他的工作人员池赶上来?
    • 我已经审查了我的回答以涵盖非动态订阅者的情况。
    • 我实际上是想弄清楚是否可以让我的工作池监听一个静态队列,而生产者继续创建自己的匿名队列。与此同时,rabbitmq 将那些匿名队列轮询到我的静态队列中。有意义吗?
    【解决方案2】:

    使用 AMQP,您可以将消息发布到 Exchange 并使用队列中的消息。不用担心“队列”在其他消息传递技术中的含义。

    在我看来,您的场景可以通过主题交换轻松处理。使用 cat.silly、cat.older、cat.interesting 等路由键发布消息。然后让每个消费者使用绑定键 cat.*

    声明一个队列

    这样,由于绑定键中的通配符,所有发布到交换器的任何前缀的消息都将被复制到队列中。如果您的消费者实际上正在进行循环共享,即不应将消息复制到多个队列,那么只需让所有消费者使用相同的队列名称。如果每个消费者都使用相同的队列名称,那么您可以将其编译到您的代码中,而不必担心名称是什么。但是当你想调试消息流时,只需创建一个消费者,它使用相同的绑定键 cat.*订阅名为 catdebug 的队列。*

    但是,如果每个消费者都是专门的并且想要挑选和选择要处理的消息,那么让每个消费者使用唯一的队列名称。这样每个消费者都会看到每条消息的副本。

    主题交换是首先尝试的最佳解决方案,因为可以轻松模拟直接交换和扇出交换的语义。

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多