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