当前位置: 首页 > news >正文

RabbitMQ 消费异常:库存不足无法释放的定位与解决

在实际的电商项目中,订单取消后往往需要 释放商品库存,以便其他用户能够正常下单。但最近在调试 mall-portal 项目时,遇到了一次 RabbitMQ 消费异常,报错信息如下:

Caused by: com.macro.mall.common.exception.ApiException: 库存不足,无法释放!
at com.macro.mall.common.exception.Asserts.fail(Asserts.java:11)
at com.macro.mall.portal.service.impl.OmsPortalOrderServiceImpl.cancelOrder(OmsPortalOrderServiceImpl.java:336)

看起来是调用 订单取消逻辑 时,库存释放出现了问题。

问题定位

通过日志堆栈可以发现异常来自:

OmsPortalOrderServiceImpl.cancelOrder()

定位到代码:

//解除订单商品库存锁定
if (!CollectionUtils.isEmpty(orderItemList)) {for (OmsOrderItem orderItem : orderItemList) {int count = portalOrderDao.releaseStockBySkuId(orderItem.getProductSkuId(), orderItem.getProductQuantity());if(count==0){Asserts.fail("库存不足,无法释放!");}}
}

这里的逻辑是:

  1. 遍历订单商品。
  2. 调用 portalOrderDao.releaseStockBySkuId() 释放库存。
  3. 如果返回 count==0,直接抛出异常 库存不足,无法释放!。

问题就在这里:
订单取消可能被 RabbitMQ 重复消费(例如超时队列触发),当库存已经释放过一次,再次调用时 count==0,就会抛异常。

问题分析

这种场景其实并不是业务错误,而是 重复释放库存。
按照健壮性原则,应该记录一次警告日志,而不是抛出业务异常。否则,RabbitMQ 消费端会报错,消息堆积,影响后续逻辑。

解决方案

我们不再使用 Asserts.fail() 抛出异常,而是改成 日志告警 + 跳过,让系统能继续运行。

修改前:

if(count==0){Asserts.fail("库存不足,无法释放!");
}

修改后:

if (count == 0) {log.warn("订单 {} 的商品 SKU {} 库存释放失败,可能已释放过或不存在锁定记录",orderId, orderItem.getProductSkuId());continue;
}

这样做的好处:

  • 避免了 RabbitMQ 消费端抛异常。
  • 出现问题时仍然会有日志记录,方便排查。
  • 系统能正确处理重复消费场景,保证幂等性。

总结

这次问题的根本原因是:

  • 消息队列触发了重复消费。
  • 代码缺乏 幂等性设计,直接抛异常。

最终通过 日志警告代替异常 的方式解决了问题。

👉 在分布式系统中,幂等性 是非常关键的设计点。任何可能被 重复执行 的操作(如库存释放、积分返还、优惠券回滚),都应该具备幂等保证,否则很容易出错。

🚀 后续可以考虑在 releaseStockBySkuId 方法里直接做幂等控制,这样调用方就不需要关心重复释放问题。

http://www.dtcms.com/a/422599.html

相关文章:

  • 邳州做网站pzwode网站开发的相关技术
  • 精读C++20设计模式——结构型设计模式:代理模式
  • C# 循环和条件用法大全(while dowhile for foreach if Switch try)全站最全
  • 设计模式(C++)详解——中介者模式(3)
  • 小程序原创--基于微信开发者工具实现的猜谜游戏程序
  • 如何进行WGBS的数据挖掘——从甲基化水平到功能通路
  • C# 23种设计模式详解与示例
  • 以创新技术解决客户痛点 在细分领域铸就核心竞争力新天力叩响资本市场大门
  • 14.单臂路由(2025年9月29日)
  • 湖南网站建设平台配置asp网站
  • 计育韬:基于AI的数据可视化设计入门工作流
  • 手势检测(充满科技感)
  • 大模型的第一性考虑:从信息论、计算理论与物理约束的视角
  • MySQL备份策略核心知识点总结
  • 企业微信-智能表格介绍
  • 2025 AI 落地图谱:从技术突破到产业重构的变革之路
  • [pytest] 一文掌握 fixture 的作用域(scope)机制
  • MVC HTML 帮助器
  • Android -Glide实战技术总结
  • 信息展示网站怎么做能够让网站流量大
  • Linux 系统 IO 编程入门:从文件操作到硬件设备访问
  • 以CodeBuddy Code为砚,Prompt为丹青,勾勒编程星河
  • 房产网站模板程序wordpress去版权
  • OpenCV 摄像头参数控制详解
  • Kimi-Audio:Kimi开源的通用音频基础模型,支持语音识别、音频理解等多种任务
  • 阿里开源视频修复方法Vivid-VR:以独特策略与架构革新,引领生成视频修复高质量可控新时代。
  • 独立开发在线客服系统手记:实现对 PostgreSQL 的支持,以及与 MySQL 的对比
  • 【项目】Vision Master OpenCV 3.0 版本(预)发行说明
  • 官方网站是什么意思网站备案 godaddy
  • 温州网站运营长沙网页制作模板