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

时间:2014-03-09 16:34:09

标签: rabbitmq channel

我的应用有多个线程,可以将消息发布到单个RabbitMQ群集 读兔子docs:我读了以下内容:

  

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

我明白,而不是打开多个连接(昂贵)
最好打开多个频道。

但为什么不对所有线程使用单个通道呢? 在单个频道上使用多个频道有什么好处?

1 个答案:

答案 0 :(得分:3)

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

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

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