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

如何解决消费者高频触发订单更新?

目录

一、业务逻辑

二、注意事项

三、解决思路

1.保证命中主键

 2. 保证更新语句是幂等的

3. 分布式锁限流(仅当并发极高时)

常见性能/死锁隐患 & 优化对策


 

一、业务逻辑

[定时任务线程]           [RocketMQ 消费者线程]
   ↓                         ↓
 查询订单 by ID       <-   收到消息
   ↓                         ↓
 构造消息 DTO          <-   调用 updateOrder()
   ↓                         ↓
 RocketMQ 发送         <-   执行 SQL: UPDATE charge_order SET ...


二、注意事项

业务逻辑显示消费者高频触发的后台任务(如 Kafka、RabbitMQ、RocketMQ 等),在并发量大时,不断触发更新操作,而更新操作如果:

  1. 未控制事务提交时间

  2. 锁了范围较大的数据(如用 WHERE status = 1

  3. 没有命中合适索引

就非常容易造成你现在看到的“锁等待堆积 + 死锁”。

三、解决思路

1.保证命中主键

确认表结构中 id 是主键(InnoDB 默认聚簇索引),这点大概率没问题,但还是要核查。

 2. 保证更新语句是幂等的

加一层状态判断,避免重复更新

3. 分布式锁限流(仅当并发极高时)

比如你一天有几万订单但集中在一分钟内结束,可以考虑对 charge_order 做 分片或限流处理(如 Hash 到 10 个消费线程池,每个只处理部分订单)。

常见性能/死锁隐患 & 优化对策

问题类型举例优化建议
长事务update + 写日志 + 发通知 一起做拆开事务,只把更新放事务里
重复更新多次 UPDATE charge_order SET status=2 WHERE id=?AND status != 2 防止无意义更新锁
索引未命中用了 WHERE status=1 AND end_time<?确保走主键或组合索引
并发更新同一行多个线程同时更新 id=123判断状态、幂等处理;考虑分片
批处理触发扫描1000个订单,全部发消息分批分页处理,每秒不要太多并发

相关文章:

  • WeakSet:JavaScript 中容易被忽视的“弱集合”
  • spark和Hadoop的对比和联系
  • DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册
  • 文档管理 Document Management
  • exception:com.alibaba.nacos.api.exception.NacosException: user not found! 解决方法
  • Django 入门实战:从环境搭建到构建你的第一个 Web 应用
  • linux kallsys
  • AI 技术发展:从起源到未来的深度剖析
  • 解决Python与Java交互乱码问题:从编码角度优化数据流
  • Kubernetes相关的名词解释etcdctl(20)
  • 脑动力学复杂性作为帕金森病患者认知能力下降的标志
  • 基于无障碍跳过广告-基于节点跳过广告
  • 如何简化复杂流程提升执行效率
  • JavaFX GUI编程实战:一步步打造经典“井字棋”游戏
  • transformer-位置编码
  • 【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试
  • 智慧工地整体解决方案-1PPT(62页)
  • Vue 的数据代理机制
  • Java基础 4.22
  • js 生成pdf 并上传文件
  • “雷公”起诉人贩子王浩文案开庭:庭审中不承认拐走川川
  • 习近平同肯尼亚总统鲁托会谈
  • 173.9亿人次!一季度我国交通出行火热
  • 最大涨幅9800%!金价新高不断,引发期权“末日轮”效应,沪金期权多张合约大涨
  • 《哪吒2》延长放映至5月31日,当前全球票房已超157亿
  • A股三大股指涨跌互现:黄金股再度走强,两市成交10900亿元