步骤 3:根据订单号查询轮询下单结果说明
- order-core(订单核心服务)提供根据订单号查询订单是否已创建接口(/order/is-created)
- 该接口返回报文应包括,订单号、订单创建状态(创建中,创建成功,创建失败)、创建失败原因
- 前端定时轮询该接口,查询订单是否创建成功,轮询频率可根据实际情况进行调整,比如 20ms 一次
- 轮询到订单创建成功,可直接唤起支付,失败则直接提示失败信息
2. 订单主表和订单明细表通过订单号进行关联 。
3. 分库要求:
- 某个用户的所有订单在同一个库,避免跨库查询(可根据用户 id——buyerId 定位到分库编号)
- 某个商家的所有订单在同一个库,避免跨库查询(可根据商家 id——sellerId 定位到分库编号)
- 可以根据订单号查询(可根据订单号定位到分库编号)
- 订单主表进行冗余,订单主表分成用户订单主表(buyer_order)和商家订单主表(seller_order)
- 用户订单主表(buyer_order)按照 buyerId % 32 进行分库
- 商家订单主表(seller_order)按照 sellerId %32 进行分库
- 订单号末位带上分库编号,分库编号为 buyerId % 32
- 订单明细表(order_detail)按照订单号进行分库,确保同一个订单的明细在同一个库
- 用户订单主表(buyer_order)同步写入,因为订单是由用户发起的,需要保证实时性 。
- 商家订单主表(seller_order)建议保证最终一致性即可,可根据实际业务选择同步双写或者通过 MQ 异步写入

文章插图
库存扣减方案
- 采用预占库存方案:创建订单时预占库存
- 库存不足,预占失败,下单失败
- 库存足够,预占成功,创建订单
- 订单创建成功,扣减库存;创建订单失败或者取消订单,释放库存

文章插图
库存设置到 redis 中,已 skuId 为 key,变化的数量为值,如:
- 将 skuId=10086 的库存值初始化为 100,redis.incrby(10086, 100)
- 库存初始化后,只能对库存进行加减操作,不允许做覆盖操作
- Redis 和数据库的库存保持最终一致性
- 库存被预占时,生成库存预占流水,关键字段有,订单号、skuId、预占数量、流水状态有(预占中、已扣减、已释放),预占超时时间,同时可以在 Redis 或者数据库中维护一个 skuId 对应的总预占数量字段,总预占数量 + 预占数量
- 订单中心发送库存扣减消息,库存中心消费消息时更新库存流水状态为已扣减,总预占数量 - 预占数量
- 订单中心发送库存释放消息,库存中心消费消息时更新库存流水状态为已释放,返还库存到 Redis,总预占数量 - 预占数量
/** * 预占库存 伪代码 * @param orderNo 订单号 * @param skuId sku 标识 * @param quantity 预占数量 */boolean preOccupy(String orderNo, String skuId, int quantity) {boolean isPreOccupySuccess = false;int value = https://www.isolves.com/it/cxkf/jiagou/2022-04-20/redis.decrby(skuId, quantity);if (value >= 0) {// 库存充足// 生成库存预占流水记录//(关键字段:orderNo,skuId,quantity,state(0-预占中;1-已扣减;2-已释放),timeout(超时时间)isPreOccupySuccess = true;} else {// 库存不足,返还刚才预占的库存redis.incrby(skuId, qunatity);}return isPreOccupySuccess;}数据库的库存数量禁止覆盖更新!扣减库存伪 SQL:update stock set stock_num = stock_num - 变化的值 where sku_id = 10086关于释放库存对一些释放异常的情况,可由库存中心调度服务,找出库存预占流水状态为预占中且预占超时的记录,根据订单号向订单中心确认该订单号的库存是已扣减还是已释放,再进行相应业务处理 。
其他除了以上大的方面设计,分布式事务、幂等、补偿、压测……这些点是大家在设计系统时都需要考虑的,不在本文讨论范围 。
推荐阅读
- 上海市|加餐!上海大爷站在阳台上钓起8斤野生大鲤鱼,楼下邻居帮忙抄鱼
- 红茶使用下投法,冲泡红茶最佳壶形
- 和田玉籽料|和田玉籽料市场现状:红皮白肉克10万,普品持续下跌?
- 秘书|网传董明珠秘书离职,本人亲自下场回应,“打工”二字让网友感慨
- 华硕|价同618 全年最香!ROG魔霸新锐、幻16大牌惊喜秒杀8999元起
- 英式红茶泡法白兰地,英式下午茶的泡法
- Intel|打造M1同款芯片!Intel下一代CPU将用上台积电5nm工艺
- 00后|00后“按时下班”被批评,发小作文怒怼老板,去年画的饼还没吃完
- 微软|频繁自动下载未知文件!微软Outlook Mac端出现“离奇”新Bug
- 泡红茶的容器选多大,楚云仙红茶
