一个通道 - RabbitMQ 中的一个队列?

Posted

技术标签:

【中文标题】一个通道 - RabbitMQ 中的一个队列?【英文标题】:One channel - one queue in RabbitMQ? 【发布时间】:2016-05-20 15:16:43 【问题描述】:

到目前为止,对于 RabbitMQ 中的单个队列,我使用的是单个通道 但是现在我有多个动态创建的队列,所以我必须为 每个 队列创建一个 new 通道,或者一个通道可以接收/发送来自/发送到不同队列的消息?

   # consuming
    for ch in items:
      channel1 = rconn.channel()
      channel1.queue_declare(queue=itm)
      channel1.basic_consume(some_callback, queue=itm, no_ack=True)
      channel1.start_consuming()


    # publishing
    for ch in items:
    # ....
      channel1.basic_publish(exchange="", routing_key=itm, body="fdsfds")

【问题讨论】:

【参考方案1】:

我在尝试重用频道时遇到了奇怪的问题。我会选择多个频道。我使用 iirc 结束了每种类型的生产者/消费者一个。

【讨论】:

你能给我看一下代码吗,因为当我调用“start_sumption()”时它会进入一个无限循环,那么我该如何设置多个通道? 澄清一下,我在一个应用程序中有不同类型的消息处理器,我试图维持一个单一的渠道,并在消费者和用来吸引粉丝的东西之间共享它。这是几年前的事了:) 抱歉,这无助于我理解如何做到这一点。【参考方案2】:

您不需要为每个频道设置一个队列。您可以在同一通道上的多个队列中声明和消费。请参阅this question 了解更多信息。

在许多客户端库中,队列声明“RPC”操作不应与消费“流”操作混合。在这种情况下,最好有两个通道:一个用于任意数量的 RPC 事情,例如队列声明、删除、绑定创建等,另一个用于任意数量的消费。

我认为官方的 Python 驱动程序正确处理了这个问题,并且不需要两个以上的通道。

要(非常粗略且不确定地)对此进行测试,在某处启动发布者,将稳定的消息流发送到队列,并在该队列上创建一个消费者,该消费者在重复声明其他队列的同时消费消息。如果一段时间内一切正常,您的客户端就可以很好地混合 RPC 和流式操作。当然,客户关于这个主题的文档比这个测试更权威。

【讨论】:

你的意思是多个消费者可以使用同一个通道消费来自多个队列的消息? @Zac B 你的回答与***.com/questions/52351459/…下面的帖子混淆了

以上是关于一个通道 - RabbitMQ 中的一个队列?的主要内容,如果未能解决你的问题,请参考以下文章

初尝RabbitMQ消息队列

快速入门分布式消息队列之 RabbitMQ(下)

WSO2 rabbitMQ - 创建但未关闭的通道 - 内存泄漏问题

使用RabbitMQ插件实现延迟队列

使用RabbitMQ插件实现延迟队列

使用RabbitMQ插件实现延迟队列