Rabbitmq - 多线程应用程序应该使用单通道还是多通道

Bic*_*ick 0 channel rabbitmq

我的应用程序有多个线程将消息发布到单个 RabbitMQ 集群。
阅读兔子文档:我阅读了以下内容:

对于使用多个线程/进程进行处理的应用程序,为每个线程/进程打开一个新通道而不是在它们之间共享通道是很常见的。

我明白,与其打开多个连接(昂贵),
不如打开多个通道。

但为什么不对所有线程使用单个通道呢?
与单个渠道相比,使用多个渠道有哪些好处?

hve*_*iga 5

AMQP 的概念是Channel为可靠的 TCP 连接提供更大的灵活性。为每条消息打开一个 TCP 连接将非常昂贵,因此他们提出了Channel连接内逻辑的想法。

Channel对所有线程使用 a 并不是一个好主意,因为如果特定线程中出现任何失败并且Channel死亡,其余线程将抛出异常AlreadyClosedException。通道可能会因多种原因而终止:例如尝试声明已经使用其他参数声明的内容或尝试取消不存在的消费者、发布到不存在的交换等等......

我最好的建议是拥有一个对象,该对象Channel在局部变量中保存 a 并实现ShutdownListener接口,因此每次通道失败时,它都能够从连接恢复并创建一个新通道。所以我想说,主要的好处是容错性和可扩展性,因为如果一个Channel死了,它不会影响其余的。