SpringBoot事务中RabbitMQ 3.10.0多节点丢事件排查求助
问题:RabbitMQ 3.10.0多节点版本偶发消息丢失且SpringBoot应用无感知
- 升级RabbitMQ至3.10.0多节点版本后,每约5000个事件中会丢失1个,发布消息的SpringBoot应用对此完全无感知。
- RabbitMQ日志显示如下错误:
2023-03-10 07:36:27.169246+01:00 [error] <0.16429.2271> Error on AMQP connection <0.16429.2271> (10.16.67.140:53607 -> 10.16.65.217:5671 - my-application-name-9.99.9#22.publisher, vhost: 'prod', user: 'sys_user', state: running), channel 4: 2023-03-10 07:36:27.169246+01:00 [error] <0.16429.2271> operation basic.publish caused a connection exception channel_error: "unexpected command while processing 'tx.commit'" 2023-03-10 07:36:27.173499+01:00 [info] <0.16429.2271> closing AMQP connection <0.16429.2271> (10.16.67.140:53607 -> 10.16.65.217:5671 - my-application-name-2.63.1#22.publisher, vhost: 'prod', user: 'sys_user') 2023-03-10 07:36:27.180047+01:00 [info] <0.6107.2408> accepting AMQP connection <0.6107.2408> (10.16.67.140:21298 -> 10.16.65.217:5671) 2023-03-10 07:36:27.181673+01:00 [info] <0.6107.2408> connection <0.6107.2408> (10.16.67.140:21298 -> 10.16.65.217:5671) has a client-provided name: my-application-name-2.63.1#23.publisher 2023-03-10 07:36:27.184094+01:00 [info] <0.6107.2408> connection <0.6107.2408> (10.16.67.140:21298 -> 10.16.65.217:5671 - my-application-name-9.99.9#23.publisher): user 'sys_user' authenticated and granted access to vhost 'prod'
核心问题
RabbitMQ在事务提交阶段出错,但未将错误反馈给SpringBoot应用,导致Spring应用事务未回滚。目前仅一个特定SpringBoot应用出现该问题,其余约50个应用运行正常。
环境信息
- SpringBoot 2.7.7
- Spring Cloud 2021.0.5
- 消息通过Spring-Cloud-Stream发送
已尝试的无效操作
- 重启RabbitMQ和应用
- 更新工件
- 切换发布用的主RabbitMQ节点
补充信息与解决方案
- 减少RabbitMQ节点数量可显著降低错误发生次数。
- 可行解决方案:
该问题属于Spring AMQP与RabbitMQ 3.10+版本的兼容性问题,根源是事务提交(tx.commit)过程中客户端与服务器的命令时序不匹配。可通过以下方式解决:- 优先方案:升级Spring AMQP版本至2.4.12及以上、2.5.7及以上或3.0.6及以上,新版本修复了该时序问题。
- 配置调整:在Spring Cloud Stream的Rabbit绑定器配置中添加:
同时确保事务配置正确,避免在事务提交过程中发送额外命令。spring.rabbitmq.publisher-confirm-type=correlated spring.rabbitmq.publisher-returns=true - 临时过渡方案:在RabbitMQ的
rabbitmq.conf配置文件中添加amqp_client.tx_select_optimization = false,禁用tx.select优化,但此方法仅作为临时措施,仍推荐升级客户端版本。
内容的提问来源于stack exchange,提问作者GJohannes
相关产品推荐
相关产品推荐

