小编典典

RabbitMQ和channel和connection的关系

all

RabbitMQ Java 客户端有以下概念:

  • Connection- 与 RabbitMQ 服务器实例的连接
  • Channel- ???
  • 消费者线程池 - 从 RabbitMQ 服务器队列中消费消息的线程池
  • 队列 - 一种以 FIFO 顺序保存消息的结构

我试图理解这种关系, 更重要 的是,它们之间的 关联

  1. 我仍然不太确定 aChannel是什么,除了这是您发布和使用的结构,并且它是从开放连接创建的。如果有人可以向我解释“频道”代表什么,它可能有助于澄清一些事情。
  2. Channel和Queue是什么关系?可以使用同一个 Channel 与多个 Queue 进行通信,还是必须是 1:1?
  3. Queue和Consumer Pool是什么关系?多个消费者可以订阅同一个队列吗?同一个Consumer可以消费多个Queue吗?还是1:1的关系?

阅读 76

收藏
2022-06-24

共1个答案

小编典典

  1. AConnection表示到消息代理的真实 TCP 连接,而 aChannel是其中的虚拟连接(AMQP 连接)。这样,您可以在应用程序中使用任意数量的(虚拟)连接,而不会因 TCP 连接而使代理过载。

  2. 你可以用一个Channel来做任何事情。但是,如果您有多个线程,建议Channel为每个线程使用不同的线程。

Java 客户端 API 指南中的通道线程安全

通道实例可以安全地被多个线程使用。对 Channel 的请求是序列化的,一次只有一个线程能够在 Channel
上运行命令。即便如此,应用程序应该更喜欢每个线程使用一个 Channel,而不是在多个线程之间共享同一个 Channel。

Channel和之间没有直接关系Queue。AChannel用于向代理发送 AMQP
命令。这可以是队列或类似的创建,但这些概念并没有联系在一起。

  1. 每个都Consumer在从消费者线程池分配的自己的线程中运行。如果多个 Consumer 订阅了同一个 Queue,则 broker 使用循环在它们之间平均分配消息。请参阅教程二:“工作队列”

也可以将其附加Consumer到多个队列。您可以将消费者理解为回调。每次消息到达消费者绑定的队列时都会调用这些。对于 Java Client 来说,每个
Consumer 都有一个 method
handleDelivery(...),代表回调方法。您通常做的是子类化DefaultConsumer和覆盖handleDelivery(...)。注意:如果将同一个
Consumer 实例附加到多个队列中,该方法将被不同的线程调用。因此,如有必要,请注意同步。

2022-06-24