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
. 希望有人能指点一下.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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 是不存在这个问题的。