【问题标题】:Subscribe to a group of consumers using RabbitMQ?使用 RabbitMQ 订阅一组消费者?
【发布时间】:2017-10-05 08:18:46
【问题描述】:

我不完全确定这是问的正确地方,但我对 RabbitMQ 实现发布/订阅消息系统的功能有疑问。我正在调查 RabbitMQ,看看它是否适合我工作的公司的需求,我在官方文档或互联网上都找不到这些问题的答案:

  • 消费者是否可以订阅一组发布者?我想这是可能的,如果我们想要订阅的组中的所有发布者都将他们的消息发送到交换器,然后将它们转发给订阅者。什么是最合适的交换类型来实现这个?
  • 是否可以订阅一组主题?例如,如果我们有多个以“data”开头的主题,如 data_1、data_2 等,是否可以让消费者订阅“data*”?我对此一无所知,但从我收集到的关于交易所如何运作的信息来看,这似乎是不可能的。
  • 是否可以有子主题,甚至子子主题? 据我目前了解,使用主题或标头交换,子主题和子子主题基本上是路由键的一部分,例如 data.diag.signal 。

我希望我说得足够清楚,并提前感谢您的回答。

【问题讨论】:

    标签: rabbitmq messaging publish-subscribe messagebroker


    【解决方案1】:

    将在我的回答中使用 Java API 示例。

    消费者是否可以订阅一组发布者?

    RMQ 消费者不知道发布者。它们之间的实体是队列(以及来自生产者(发布者)方面的交换)。 Java API com.rabbitmq.client.Channel.basicConsume(String, Consumer) 只允许从一个队列消费。但是您可以将相同的 Consumer 回调传递给多个队列

    另一种方法是创建每个消费者队列,并使用channel.queueBind 将其绑定到产生有趣消息的交换。或者更简单,让他们发布到某个通用交换并绑定到那个。

    是否可以订阅一组主题?例如,如果我们有多个以“data”开头的主题,如 data_1、data_2 等,是否可以让消费者订阅“data*”?我没有在这方面找到任何东西,但从我收集到的关于交易所如何运作的信息来看,这似乎是不可能的。

    不明确,因为您需要传入队列名称。 但是您可以使用交换路由解决: 如果你目前的状态是:

    producer1 -> exchange-data-1 -> queue-data-1
    producer2 -> exchange-data-2 -> queue-data-2
    producer3 -> exchange-data-3 -> queue-data-3
    

    你也可以建立一个新的交易所

    producer1 -> exchange-data-1 --\ 
    producer2 -> exchange-data-2 -> exchange-data-all -> queue-per-consumer -> your-consumer
    producer3 -> exchange-data-3 --/
    

    是否可以有子主题,甚至子子主题?据我目前了解,使用主题或标头交换,子主题和子子主题基本上是路由键的一部分,例如 data.diag.signal。

    RMQ 中没有子主题概念,但是,正如您所提到的,您可以使用topic(甚至是headers,用于更丰富的设计)进行交流。

    【讨论】:

    • 感谢您的回答,非常有帮助!关于主题交换的通配符,我知道可以订阅诸如 A.B.* 或 A.*.* 之类的主题,但是可以订阅诸如 A.*.C 之类的内容吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2017-07-17
    • 2017-02-20
    • 1970-01-01
    相关资源
    最近更新 更多