提问者:小点点

RabbitMQ与通道与连接的关系


RabbitMQ Java客户端有以下概念:

  • 连接-与RabbitMQ服务器实例的连接
  • 通道-???
  • 使用者线程池-使用RabbitMQ服务器队列中的消息的线程池
  • 队列-按FIFO顺序保存消息的结构

我试图理解他们之间的关系,更重要的是,他们之间的联系。

  1. 我仍然不太清楚通道是什么,除了这是您发布和使用的结构,并且它是从一个开放的连接创建的。如果有人能向我解释一下“通道”代表什么,可能有助于澄清一些问题。
  2. 通道和队列是什么关系?可以使用相同的通道与多个队列通信吗?还是必须是1:1?
  3. 队列和消费者池之间的关系是什么?多个使用者可以订阅到同一个队列吗?多个队列可以被同一个消费者消费吗?或者关系是1:1?

共1个答案

匿名用户

>

  • 连接表示到message broker的真实TCP连接,而通道是其内部的虚拟连接(AMQP连接)。这样,您就可以在应用程序中使用任意多的(虚拟)连接,而不会用TCP连接重载代理。

    您可以使用一个通道进行所有操作。但是,如果您有多个线程,建议为每个线程使用不同的channel

    通道线程-Java客户端API安全指南:

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

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

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

    还可以将相同的使用者附加到多个队列。您可以将消费者理解为回调。每次消息到达使用者绑定到的队列时,都会调用这些命令。对于Java客户机,每个使用者都有一个方法handledelivery(...),它表示回调方法。您通常要做的是子类DefaultConsumer并重写HandleDelivery(...)。注意:如果您将同一个使用者实例附加到多个队列,则此方法将由不同的线程调用。因此,如果需要,请注意同步。