一、背景
商品需要调用供应商的接口来实现订单的创建
在项目就存在两个订单,一个是供应商的订单、一个是项目自身的订单,实际就是一个订单
二、流程
https://www.processon.com/embed/611ca4261e0853164d2e3d02
在从用户点击购买到用户点击支付 ,最后成功返回订单号接着支付流程,失败则回滚操作
1、首先在商品页的时候点击购买,就需要开始校验库存、金额、邮费、收货地址等信息。
2、没有收货地址的,则要重新选择,且选择收货地址后,还需要调用类似刚才第一个的接口,根据选择的地址,再次计算邮费、金额。
3、在确定订单页面,用户点击购买则进入到创建订单接口中
在分布式系统中处理订单事务,采用Seata-tcc来进行一个事务二段式的提交\回滚
创建项目订单成功,则二段式提交修改订单状态,失败则回滚删除订单
创建供应商订单成功,则二段式提交修改订单状态,失败则回滚删除订单+取消供应商订单
创建订单明细成功,则继续下一步,失败则回滚删除订单+取消供应商订单+回滚订单明细数据4、订单创建成功了,则返回订单号,且该订单号放入消息队列,若干时间没支付后,则调用取消订单的接口
三、其它相关
取消订单:订单状态修改、取消供应商订单,执行前注意检查状态,防止二次取消操作。消息队列在执行消费时,也是调回取消订单的接口。
订单支付:订单在支付成功后,则需要对库存、商家余额、用户资金等进行扣除。最后成功修改订单状态
订单发货:发货的接口通常给到供应商进行调用,接口做好幂等性处理,防止脏数据
订单收货:收货通常分成自动收货、和用户手动收货。像15天自动确认收货的逻辑,这边的处理方式是,定时任务1小时,查出一批距离收货时间少于1小时的订单,发到消息队列中,使用延迟消息的方式,在1小时内消费订单。这样操作减少了 消息队列的压力,1个小时查询一次对数据的压力也不会太大的压力