rocketmq下单支付场景

这篇博客探讨了电商系统的订单支付流程,包括下单、支付回调和库存回退的处理。在支付环节,强调了支付成功后更新订单状态、记录日志和发送消息到消息队列的重要性。同时,提出了应对并发问题的方案,如使用乐观锁和分布式锁来确保数据一致性,并通过线程池优化减少处理延迟。此外,还讨论了消息幂等性的处理策略。
摘要由CSDN通过智能技术生成

 1.订单支付总体流程

 2.下单流程及问题

下单确认失败,在catch中发送失败消息,库存,优惠券消费失败消息,注意采取广播消费模式

3.支付流程及问题

 支付成功后,需要记录支付日志,修改订单状态,扣积分。支付成功,收到回调消息后,发送消息到消息队列,记录日志,修改订单,扣积分消息消息进行处理。

响应第三方支付平台:这个具体做什么动作。效果应该是,收到回调消息,立刻响应第三方支付平台。

 

 1.支付订单,用户开始支付时,创建支付订单,状态为待支付

2.支付回调,第三方支付回调时,更新支付订单状态,已支付

回调处理逻辑

1.判断支付是否成功,并更新支付订单状态为已支付or支付失败

2.创建并保存支付成功消息,落表

3.发送支付成功消息到mq(订单系统(订单表支付状态改为已支付),优惠券系统处理业务)

4.等待发送结果,发送成功后,删除步骤2中表中消息

为什么把支付成功消息落表,又删除,防止消息发送失败。

5.线程池优化

第3,4步,发消息并删除数据,比较耗时,造成处理堆积,这两步是在主线程中处理,现在单独创建线程池处理这两步,用子线程异步执行,如下图

4. 库存回退处理

 

 

 消费订单处理失败消息,消息幂等问题

方案1

消息表,且消息有三个状态,处理中,处理成功,处理失败,失败次数,消费次数小于3,消息来了,根据msgId查表,主键:msgkey,tag,group

不存在:写入状态为处理中消息,扣减库存,更新消息状态处理成功;

存在 :

1.状态为处理中,处理成功,流程结束

2.状态为处理失败,判断失败次数是否小于3次,是,更新次数加1,否流程结束

方案1,存在哪些问题,没有考虑并发情况存在问题

1.查询表,判断是否存在时,就不准,

2.判断失败次数,及更新次数时,都需要加乐观锁

3.查表,性能查

方案2

用redis分布式锁,消费消息把msgId存入redis,怎么判断失败次数,value保存失败次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值