要从NodeJS发布者(我使用bramqp,但问题是通用的)向RabbitMQ发布消息(已确认的,持久的),通道池化策略应该是什么?
如果我创建了一个巨大的池(20,000 +),每次我需要发布时都要寻找一个空闲通道,然后每当我得到确认时就释放通道(保持在空闲池中),那么在高负载下,确认被延迟,因此创建了大量通道,导致RabbitMQ中的erlang进程快速增加,降低其性能。
如果我管理一个非常小的池,或者没有池,那么一旦速率高,socket错误就会被抛出,唯一的选择是重置整个连接。
这里的最佳实践是什么?
我不能说我理解您在做什么,但是理解通道是协议级结构是很重要的。没有所谓的"通道池"——当您开始与AMQP服务器进行交互时,它使用一个现有的连接(如果可用),并在握手过程中通过向通道头分配一个整数值来创建一个新的"通道"。也许您的程序实际上正在创建大量连接?
我的建议是在每次需要发布时做以下操作:
- 打开通道 <
- 发布消息/gh>
- 等待确认
- 关闭频道