乐趣区

淘宝聚石塔防止同步订单漏单策略总结

  • 最近在参与做一个电商管理系统,负责了订单同步这块微服务,其中就有从淘宝这个渠道来同步订单。据了解,貌似大部分商家都是会接上淘宝的一个平台,叫做聚石塔,对商家来说,相当于提供一个对商家的基础数据服务的一个平台,可以说是一个数据库吧,然后淘宝还提供各种接口来提供对数据的服务,关于聚石塔就不作多余的阐述了,可以从官网去了解,这篇博文仅作一些总结,总结一下结合聚石塔,订单同步过程中防止漏单的策略这个业务需求。
  1. 淘宝聚石塔提供的订单是按照订单更新时间升序排序的(存储在数据库的方式),订单的状态很多情况都会发生变动,如物流更新、买家申请退款、卖家发货、买家签收等等,都会对该订单进行更新,其中有一个字段来标识订单更新时间,该订单数据也会随着更新而自动按照时间升序排序,如下图所示,聚石塔是按照订单更新时间升序排序的:

  1. 无论是何种渠道的订单同步,均有可能出现潜在的漏单风险。会出现漏单的原因是在某时间段内的订单可能很多(尤其是大促期间),不可能进行全量同步,只能进行分页的同步。使用分页同步的时候,就可能漏单了,如下图所示:

  1. 如何防止同步订单的时候漏单,聚石塔官方文档给出了一种策略,就是分页同步订单的时候,根据逆序分页来同步订单,即假设早上 7 点 -12 点这个时间段内聚石塔有 9 条订单,根据订单更新时间升序排序的,我们假设分页同步订单一页的大小是 3 条订单,那么可以分成第 1 -3,4-6,7- 9 三页订单,逆序分页同步订单,首先从倒数第一页开始同步订单第 7 - 9 条订单,在同步倒数第二页的时候,即第 4 - 6 条订单时,第 5 条订单恰好更新了,不落在 7 -12 点这个时间段内,此时查回来的数据 7 -12 点只有 8 条数据了,那么逆序分页同步倒数第二页第 4 - 6 条订单的时候,实际上这个时候我们重复同步了第 7 条订单 而不会造成漏了同步订单,重复同步订单我们后续可以做过滤,而漏单的话造成的后果是很严重的。如下图所示:

  1. 按记录的变化时间,来轮询查询记录,如何才能不漏单?聚石塔官方给出的答案是这样子的:

按变化时间倒序,然后从后向前翻页。
目的:防止在翻页过程中,有记录变化了。
原因:从后往前翻页 ” 是防止漏单的必要条件,是防止已经读取过的数据变化了,导致后续数据整体迁移 1 位。
倒序: 倒序 + 从后向前翻页还有个好处,能够记录已经读过的时间点,如果中断,下次可以从这个时间点开始读。

  • 本文只是记录一下前阵子做的部分业务,也有参考了我们的开发设计部分内容,这个逆序分页同步这个场景比较少用,理解起来也有点费劲,故也总结一下。

一砖一瓦,坚持写博文,希望能提高自己的代码能力。如果文章有误或不足之处,欢迎指出

退出移动版