RabbitMQ和通道与连接的关系
RabbitMQ Java客户端具有以下概念:
Connection
- 与RabbitMQ服务器实例的连接 Channel
- ??? 我试图理解这种关系, 更重要的是 ,他们之间的关系。
Channel
是什么,除了这是您发布和使用的结构,并且它是从一个开放连接创建的。 如果有人能向我解释“频道”代表什么,它可能有助于清除一些事情。 预先感谢您在这里的任何帮助!
Connection
表示到消息代理的真实TCP连接,而Channel
是其内部的虚拟连接(AMPQ连接)。 通过这种方式,您可以在应用程序内部使用尽可能多的(虚拟)连接,而不会使代理与TCP连接过载。
一切都可以使用一个Channel
。 但是,如果您有多个线程,建议为每个线程使用不同的Channel
。
Java客户端API指南中的通道线程安全性:
通道实例可安全地由多个线程使用。 对通道的请求是序列化的,一次只有一个线程能够在通道上运行命令。 即便如此,应用程序应该更喜欢使用每个线程的通道,而不是在多个线程之间共享同一个通道。
Channel
和Queue
之间没有直接的关系。 Channel
用于向代理发送AMQP命令。 这可以是创建一个队列或类似的,但这些概念不绑定在一起。
每个Consumer
运行在从消费者线程池分配的自己的线程中。 如果多个消费者订阅了相同的队列,那么代理使用循环法在他们之间平均分配消息。 参见教程二:“工作队列”。
也可以将同一个Consumer
附加到多个队列中。 您可以将消费者理解为回叫。 每次消息到达队列时,都会调用这些消息。 对于Java客户端的情况,每个消费者都有一个方法handleDelivery(...)
,它表示回调方法。 你通常做的是,子类DefaultConsumer
并重写handleDelivery(...)
。 注意:如果您将相同的Consumer实例附加到多个队列,则此方法将由不同的线程调用。 所以必要时请注意同步。
我发现这篇文章解释了AMQP模型的所有方面,其中,频道是一个。 我发现它对我的理解非常有帮助
https://www.rabbitmq.com/tutorials/amqp-concepts.html
某些应用程序需要多个连接到AMQP代理。 但是,不希望同时打开许多TCP连接,因为这样做会占用系统资源并使配置防火墙变得更加困难。 AMQP 0-9-1连接与可被认为是“共享单个TCP连接的轻量级连接”的通道复用。
对于使用多个线程/进程进行处理的应用程序,通常为每个线程/进程打开一个新通道并且不共享它们之间的通道。
特定通道上的通信与另一个通道上的通信完全分离,因此每个AMQP方法都会携带一个客户端用来确定该方法适用于哪个通道的通道号(例如,因此需要调用哪个事件处理程序) 。
对AMQP协议“底层”所做的概念性理解很有用。 我认为AMQP 0.9.1选择部署的文档和API使得这个特别令人困惑,所以这个问题本身就是许多人必须面对的问题。
TL; DR
连接是与AMQP服务器的物理协商TCP套接字。 正确实施的客户端将为每个应用程序提供其中一种线程安全的线程可共享的应用程序。
通道是连接上的单个应用程序会话。 线程将有一个或多个这些会话。 AMQP体系结构0.9.1是这些不被线程共享的,并且当创建它的线程完成它时应该被关闭/销毁。 当发生各种协议违规时,它们也被服务器关闭。
消费者是一种虚拟构造,表示特定频道上存在“邮箱”。 消费者的使用告诉代理将消息从特定队列推送到该信道端点。
连接事实
首先,正如其他人已经正确指出的那样, 连接是表示到服务器的实际TCP连接的对象。 连接在AMQP中的协议级别指定,并且与代理的所有通信都发生在一个或多个连接上。
频道的事实
一个频道是应用程序会话,为你的每一个应用程序打开与RabbitMQ代理进行通信。 它通过单一连接进行操作,并代表与经纪人的会话。
消费者事实
消费者是由AMQP协议定义的对象。 它既不是一个渠道,也不是一个连接,而是你的特定应用程序用作排序信息的“邮箱”。
就消费者线程池的含义而言,我怀疑Java客户端正在做类似于我的客户端编程(我的客户端基于.Net客户端,但经过大量修改)的操作。
链接地址: http://www.djcxy.com/p/34179.html上一篇: RabbitMQ and relationship between channel and connection