The RabbitMQ Java 客户端有以下几个概念:
-
Connection
- 与 RabbitMQ 服务器实例的连接
-
Channel
- ???
- 消费者线程池 - 消费来自 RabbitMQ 服务器队列的消息的线程池
- 队列 - 按 FIFO 顺序保存消息的结构
我试图理解其中的关系更重要的是, the 协会它们之间。
- 我还是不太确定什么是
Channel
是的,除了这是您发布和使用的结构,并且它是从开放连接创建的这一事实之外。如果有人可以向我解释“频道”代表什么,它可能有助于澄清一些事情。
- Channel和Queue是什么关系?是否可以使用同一个 Channel 与多个 Queue 通信,还是必须是 1:1?
- Queue 和 Consumer Pool 之间是什么关系?多个Consumer可以订阅同一个Queue吗?同一个Consumer可以消费多个Queue吗?还是1:1的关系?
A Connection
表示与消息代理的真实 TCP 连接,而Channel
里面是一个虚拟连接(AMQP连接)。这样,您就可以在应用程序中使用任意数量的(虚拟)连接,而不会因为 TCP 连接而使代理过载。
-
您可以使用一个Channel
对于一切。但是,如果您有多个线程,建议使用不同的线程Channel
对于每个线程。
Java 客户端 API 指南中的通道线程安全:
通道实例可以安全地被多个线程使用。请求进入
一个 Channel 是序列化的,只有一个线程能够运行一个 Channel
一次在通道上发出命令。即便如此,应用程序应该更喜欢
每个线程使用一个 Channel,而不是跨线程共享同一个 Channel
多线程。
之间没有直接关系Channel
and Queue
. A Channel
用于向代理发送 AMQP 命令。这可以是队列或类似的创建,但这些概念并不捆绑在一起。
-
Each Consumer
在从消费者线程池分配的自己的线程中运行。如果多个消费者订阅同一个队列,代理将使用循环法在它们之间平均分配消息。看教程二:“工作队列”.
也可以附加相同的Consumer
到多个队列。
你可以将Consumer理解为回调。每当消息到达消费者绑定到的队列时都会调用这些函数。对于Java客户端的情况,每个消费者都有一个方法handleDelivery(...)
,代表回调方法。你通常做的是,子类DefaultConsumer
并覆盖handleDelivery(...)
。注意:如果将同一个Consumer实例附加到多个队列,该方法将被不同的线程调用。因此,如有必要,请注意同步。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)