订单系统的设计与实现

订单的状态

状态进入操作进入条件
草稿新建订单 ,保存订单;提交审批失败,审批拒绝新建订单:插入新订单, 保存订单:修改订单;提交审批失败:修改订单,审批拒绝:修改订单
待审批提交审批修改库存数量,修改订单状态,插入新审批数据
待提交审批通过修改审批系统,修改订单系统
待执行点击“提交”按钮修改库存系统,修改订单系统
已完成点击“完成”按钮修改订单系统,写入财务系统

关键问题的设计

提交订单的数据一致性
  1. 向库存系统发送扣减库存请求,库存系统扣减库存数量(使用排它锁保证),并通过消息队列插入库存扣减操作日志,请求失败时,终止操作(原因:库存不足,系统异常,网络原因)。
  2. 库存扣除成功后,修改订单状态为“待审批”,并通过消息队列插入库存扣减成功日志。修改订单状态失败时,终止操作,并向库存系统发送恢复扣减库存请求(订单系统无需处理该请求的失败)。
  3. 库存系统处理扣减库存请求时,生成库存扣减操作id并返回给订单系统,订单系统发送恢复扣减库存请求时传入该id,库存系统根据扣减操作日志恢复库存数量,并通过消息队列插入库存扣减已恢复日志。
  4. 库存系统需要定时扫描日志,如果一条操作日志没有对应的完成日志(根据操作id匹配),则根据操作日志记录恢复库存,并通过消息队列插入库存扣减已恢复日志。

通过消息队列的顺序消息特性保证库存扣减操作日志的顺序,并由消息队列消费端保证操作日志写入的幂等性(保证每次扣减库存操作只有一条扣减记录和完成记录),成功日志和已恢复日志属于完成记录。
消息队列中消息堆积时,日志写入延迟,导致部分操作日志不完整,所以定时扫描任务应定义合理的时间偏移,仅扫描能确保正确的日志,并且在消息堆积较为严重时,及时停止定时扫描任务 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值