我的应用程序有多个线程,可以将消息发布到单个RabbitMQ集群 .读兔子docs:我读了以下内容:
对于使用多个线程/进程进行处理的应用程序,每个线程/进程打开一个新通道并且不在它们之间共享通道是很常见的 .
我明白,而不是打开多个连接(昂贵)最好打开多个 Channels .
但为什么不对所有线程使用单个通道?在单个 Channels 上使用多个 Channels 有什么好处?
AMQP具有 Channel 的概念,可以在可靠的TCP连接上提供更大的灵活性 . 每条消息打开一个TCP连接将非常昂贵,因此他们在连接中提出了逻辑 Channel 的想法 .
Channel
对所有线程使用 Channel 并不是一个好主意,因为如果某个特定线程中的任何内容失败并且 Channel 死亡,则其余线程将抛出异常 AlreadyClosedException . 通道可能由于多种原因而死亡:例如,尝试声明已经使用其他参数声明的内容或尝试取消不存在的消费者等等...
AlreadyClosedException
我最好的建议是让一个对象在本地变量中保存 Channel 并实现 ShutdownListener 接口,因此每次通道失败时,它都能够从连接中恢复并创建一个新的 . 所以我要说主要的好处是容错和可扩展性,因为如果 Channel 死了它不会影响其余部分 .
ShutdownListener
1 回答
AMQP具有
Channel
的概念,可以在可靠的TCP连接上提供更大的灵活性 . 每条消息打开一个TCP连接将非常昂贵,因此他们在连接中提出了逻辑Channel
的想法 .对所有线程使用
Channel
并不是一个好主意,因为如果某个特定线程中的任何内容失败并且Channel
死亡,则其余线程将抛出异常AlreadyClosedException
. 通道可能由于多种原因而死亡:例如,尝试声明已经使用其他参数声明的内容或尝试取消不存在的消费者等等...我最好的建议是让一个对象在本地变量中保存
Channel
并实现ShutdownListener
接口,因此每次通道失败时,它都能够从连接中恢复并创建一个新的 . 所以我要说主要的好处是容错和可扩展性,因为如果Channel
死了它不会影响其余部分 .