orders/paid 比 orders/create 先到是怎么回事
现象#
同步日志里 paid 处理时查不到订单主键,报外键错误;几分钟后 create 才到达,订单状态已是已付款,库存却被扣了两次。
原因#
- 两个 topic 走不同队列并行投递,网络与消费速度不同,到达顺序没有保证
- create 在订单生成时发,paid 在付款成功时发,信用卡即时支付时两者间隔不到一秒
- 手动捕获付款或草稿订单转正式订单时,paid 可能晚很久才来,也可能先到
- 消费端按到达顺序写库,没有用事件里的时间与状态做条件更新
处理步骤#
- paid 到达时先
upsert订单主记录,再补付款与扣库存字段 - 用
updated_at或processed_at做条件更新,旧值不覆盖新值 - 以
financial_status为准判断是否已付,paid 只负责触发通知与扣款 - 订单暂不存在时先丢进延迟队列稍后重试,别直接抛错进死信
- 在测试店下一笔信用卡测试单,对比两条日志的
X-Shopify-Triggered-At
验收标准#
无论哪条先到,订单表最终只有一行、financial_status 为 paid,库存只扣一次且无外键错误。
本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。