Spring集成RabbitMQ如何限制生产者并发创建的通道数量?
问题根因
你遇到的频繁创建销毁通道的现象,核心原因是开启Publisher Confirm后,发送了消息但还没收到Broker ACK的通道不会被立即放回缓存池,发送速度远大于ACK返回速度时,默认无通道数限制的配置就会不断创建新通道,缓存池满了之后闲置的临时通道就会被销毁。
解决方案
通过调整CachingConnectionFactory的三个核心配置即可实现通道数限制+阻塞等待的能力,不需要额外改业务发送逻辑:
channelCacheSize:设置缓存池常驻空闲通道数量,避免频繁销毁重建channelLimit:设置整个工厂允许创建的最大通道数,超过阈值后不再新建通道channelCheckoutTimeout:设置无可用通道时线程的阻塞等待时间,等不到再抛出异常
修改后的配置代码示例
@Bean public CachingConnectionFactory ccf() { var ccf = new CachingConnectionFactory("localhost"); ccf.setPublisherConfirmType(CORRELATED); ccf.setPublisherReturns(true); // 配置常驻缓存的通道数,可根据实际吞吐调整,比如设置为100 ccf.setChannelCacheSize(100); // 配置最大允许创建的通道总数,这里设置为200,可按需调整 ccf.setChannelLimit(200); // 配置无可用通道时的阻塞等待时间,单位毫秒,这里设置30秒等待 ccf.setChannelCheckoutTimeout(30000); return ccf; }
配置说明
- 上述配置会将并发通道数严格限制在200以内,当所有通道都被未确认的消息占满时,新的发送请求会阻塞等待最多30秒,直到有通道被归还到缓存池
- 可根据你的RabbitMQ节点支持的单连接最大通道数、实际生产吞吐调整上述参数值,调整后Rabbit控制台的通道数会稳定在你设置的区间内,不会再出现大量临时通道反复创建销毁的情况
- 注意要保证你使用的
RabbitTemplate是单例实例,不要每次发送都新建实例,否则缓存配置不会生效
内容的提问来源于stack exchange,提问作者Víctor Herraiz
相关产品推荐
相关产品推荐

