RabbitMQ 是否应该 一个 channel 对应 一个 queue?

看了一下公司以前的项目, 一个项目就创建了一个 connection 和一个 channel , 一个 channel 承担了好几个 queue 的发布和消费.
但是项目也还算稳定. 现在有新的项目要写, 我觉得这应该不好吧...
好像看到过有人说过

1 connection per app, 1 channel per thread, 1 consumer per channel.

( 由于我用的是 node , 不存在 per thread , 不过也好理解~ )
由于不知道这个说法是出自何处, 文档找了一下也没找到. 而且也好奇需要发布到多个 queue 的时候, 是否需要创建多个 channel 呢, 所以想知道大家都是怎么做的...

目前我的想法是, 一个 consumer 创建一个 channel, 但是纠结是所有的 queue 共用一个 channel 来发布消息, 还是为每个 queue 创建一个独立的 channel. 希望有人能指点一下. 😄

阅读 7k
1 个回答

Consumer 确实最好是一个 Channel 一个 Queue,但这不是硬性要求;Producer 则没这个限制。

主要原因是你得明白 Channel 起了什么作用,它实质上是屏蔽了 Connection 的细节,让开发者不用去管 TCP 层面上的事儿,同时基于 NIO 可以使得 Connection 的 TCP 能够被复用,减少了 TCP 连接建立的开销。

(题外话,所有 Channel 共用一个 Connection 并不适用全部情况,有些场景下反而会降低性能。所以你说 1 Connection per App 并不是绝对的。)

至于 1 Channel per Thread,是因为 Channel 本身不是线程安全的,这个很好理解,不多展开。

1 Consumer per Channel,是因为如果一个 Consumer 在一个 Channel 中正在监听某一个 Queue 的消息,那么这个 Consumer 是不能在这个 Channel 中同时去处理另一个 Queue 的,出于消费速度的考虑所以需要开辟多个 Channel,如果你本身没那么大消息吞吐量,也可以共用一个 Channel;而 Producer 是不存在这个问题的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题