You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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节点

补充信息与解决方案

  1. 减少RabbitMQ节点数量可显著降低错误发生次数。
  2. 可行解决方案:
    该问题属于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:05:38