158 java messaging channel amqp rabbitmq
该RabbitMQ的Java客户端具有以下概念:
Connection
- 与RabbitMQ服务器实例的连接Channel
- ???我想了解的关系,更重要的是,该协会之间.
Channel
是什么,除了这是你发布和使用的结构,以及它是从一个开放的连接创建的.如果有人可以向我解释"频道"代表什么,那么可能有助于澄清一些事情.在此先感谢您的帮助!
Ben*_*ngt 178
A Connection
表示与消息代理的真实TCP连接,而a Channel
是其中的虚拟连接(AMPQ连接).这样,您可以在应用程序中使用任意数量的(虚拟)连接,而无需使用TCP连接重载代理.
您可以使用一个Channel
.但是,如果您有多个线程,则建议Channel
对每个线程使用不同的线程.
通道实例可安全地供多个线程使用.对通道的请求是序列化的,只有一个线程能够一次在通道上运行命令.即便如此,应用程序应该更喜欢每个线程使用一个Channel而不是跨多个线程共享相同的Channel.
Channel
和之间没有直接关系Queue
.A Channel
用于将AMQP命令发送到代理.这可以是队列或类似的创建,但这些概念并没有捆绑在一起.
每个都Consumer
在从消费者线程池分配的自己的线程中运行.如果多个使用者订阅了同一个队列,则代理使用循环法在它们之间平均分配消息.请参阅教程二:"工作队列".
也可以将它附加Consumer
到多个队列.您可以将消费者理解为回调.每当消息到达Consumer绑定的Queue时,就会调用它们.对于Java客户端的情况,每个消费者都有一个方法handleDelivery(...)
,它表示回调方法.你通常做的是,子类DefaultConsumer
和覆盖handleDelivery(...)
.注意:如果将同一个Consumer实例附加到多个队列,则此方法将由不同的线程调用.因此,如有必要,请注意同步.
the*_*yer 44
对于AMQP协议在"引擎盖下"做什么的一个很好的概念性理解在这里是有用的.我建议AMQP 0.9.1选择部署的文档和API使这一点特别混乱,因此问题本身就是许多人不得不努力解决的问题.
TL; DR
一个连接与AMQP服务器的物理协商TCP套接字.正确实现的客户端将具有每个应用程序中的一个,线程安全,可在线程之间共享.
甲信道是连接上的单个应用会话.线程将具有一个或多个这些会话.AMQP体系结构0.9.1是这些不在线程之间共享,并且应该在创建它的线程完成时关闭/销毁它们.当发生各种协议违规时,服务器也会关闭它们.
甲消费者是表示一个"信箱"的特定频道上的存在的虚拟构建体.使用者告诉代理将消息从特定队列推送到该通道端点.
连接事实
首先,正如其他人正确指出的那样,连接是表示与服务器的实际TCP连接的对象.连接在AMQP中的协议级别指定,并且与代理的所有通信都通过一个或多个连接进行.
渠道事实
一个通道是打开的,每件您的应用程序与RabbitMQ的代理进行通信的应用程序会话.它通过单个连接运行,并代表与代理的会话.
消费者事实
使用者是由AMQP协议定义的对象.它既不是通道也不是连接,而是您的特定应用程序用作丢弃消息的"邮箱"的东西.
就消费者线程池的含义而言,我怀疑Java客户端正在做类似于我编写客户端的事情(我的基于.Net客户端,但经过大量修改).
Cam*_*amW 20
我发现这篇文章解释了AMQP模型的所有方面,其中,渠道就是其中之一.我觉得这对我的理解非常有帮助
https://www.rabbitmq.com/tutorials/amqp-concepts.html
某些应用程序需要与AMQP代理程序建立多个连接.但是,不希望同时打开许多TCP连接,因为这样做会消耗系统资源并使配置防火墙变得更加困难.AMQP 0-9-1连接与可被视为"共享单个TCP连接的轻量级连接"的通道复用.
对于使用多个线程/进程进行处理的应用程序,每个线程/进程打开一个新通道并且不在它们之间共享通道是很常见的.
特定通道上的通信与另一个通道上的通信完全分开,因此每个AMQP方法还带有一个通道号,客户端使用该通道号来确定该方法所针对的通道(例如,需要调用哪个事件处理程序) .
归档时间: |
|
查看次数: |
60518 次 |
最近记录: |