rocketmq下单支付场景

 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保存失败次数。

猜你喜欢

转载自blog.csdn.net/C18298182575/article/details/121289558