淘宝店铺订单同步解决方案-摘记

项目背景

最近作一个电子商务平台的投标工做,写技术标过程当中,碰到须要和淘宝集成的接口,其中有一个需求就是须要将目前ERP系统中的订单和淘宝店铺中订单进行同步,具体需求以下描述:
一、零售、批销、代销、机构订单都存储在客户的ERP系统当中;
二、淘宝商城的订单存储在淘宝中,ERP系统中不存在;
三、目前投标的电子商务平台中商品订单付款成功后须要将订单转入到ERP系统处理。
针对以上需求,咱们对淘宝的开放平台接口作了分析,其中淘宝已经提供相似场景的解决方案,具体的方案将在下面作具体的介绍。html

淘宝解决方案背景说明

订单是卖家的核心数据,卖家的不少平常工做都是围绕着订单展开,应用的基本功能就是要保证订单实时、完整的展现在卖家面前。因为API请求依赖于网络,存在着网络不稳定和同步时间长的问题,因此应用必须把淘宝的订单数据同步到本地。如何才能快速、完整的把订单同步到本地是本方案将要讨论的问题。数据库

 

名词解释

在线订单:卖家三个月内已卖出的订单。
增量订单:相对已经同步到本地的订单,凡是在淘宝上发生了变动的订单就是增量订单。
主动通知:一种经过HTTP长链接实时向客户端(应用)推送数据(交易)变动的渠道。
异步API:把业务请求与业务处理分开执行、把业务逻辑与海量计算转移到淘宝、而且结果可异步下载的API。api

API介绍

taobao.trades.sold.get
获取三个月内已卖出的在线订单,适用于用户初始化的时候使用,ISV不该该用此接口来获取增量订单。
不建议使用或尽可能少用此接口。
taobao.trades.sold.increment.get
获取增量订单,适用于用户初始化后,增量同步发生变动的订单,ISV不该该用此接口来获取三个月内的订单。
taobao.topats.trades.sold.get
异步获取三个月内已卖出的在线订单,具备简单、高效、准确的特色,而且支持超大卖家,适用于用户初始化的时候使用,强烈建议采用此接口代替taobao.trades.sold.get接口,以提高效率、下降开发成本。
taobao.trade.fullinfo.get – 获取单笔订单详情。
taobao.topats.trades.fullinfo.get – 批量获取最多100笔订单详情。服务器

实施方案

订单同步主要分为初始化和增量获取两个步骤:
1. 初始化是把3个月内的在线订单所有同步回来,这个须要较长的时间;
2. 增量获取则是把淘宝发生了变动的订单同步回来,这个通常须要较短的时间。
下面的方案都会围绕着如何初始化和增量获取来说。
方案一
同步流程
淘宝订单同步解决方案一同步流程
核心步骤
淘宝订单同步解决方案一核心步骤
一、三个月数据:经过taobao.trades.sold.get获取3个月内到如今建立的订单ID,再经过taobao.trade.fullinfo.get获取订单详情
二、增量数据:经过taobao.trades.sold.increment.get获取从如今开始的增量订单ID,再经过taobao.trade.fullinfo.get获取订单详情
适用范围
适用于ISV测试订单同步功能或生产环境的中小卖家进行订单同步。此方案比较低效,除非老的应用更新成本很高,不然不推荐你们使用,建议采用下面的方案。
方案二
同步流程
淘宝订单同步解决方案二同步流程
核心步骤
淘宝订单同步解决方案二核心步骤
一、三个月数据:经过taobao.topats.trades.sold.get异步获取3个月内到昨天23:59:59建立的订单详情
二、增量数据:经过taobao.trades.sold.increment.get获取从今天00:00:00开始的增量订单ID,再经过taobao.trade.fullinfo.get获取订单详情。
适用范围
适用于全部类型的卖家,尤为是大卖家采用此方案能够极大的提升同步速度,对于超大型的卖家(如直充、金冠级别的卖家)也能很好的支持。
方案三
同步流程
淘宝订单同步解决方案三同步流程
核心步骤
淘宝订单同步解决方案三核心步骤
一、三个月数据:
a) 首先,经过taobao.topats.trades.sold.get异步获取3个月内到昨天23:59:59建立的订单详情
b) 而后,经过taobao.trades.sold.increment.get获取从今天00:00:00到如今的增量订单ID,再经过taobao.trade.fullinfo.get获取订单详情
二、增量数据:经过主动通知客户端实时监听订单变动消息,再经过taobao.trade.fullinfo.get获取订单详情
适用范围
适用于全部类型的卖家,是全部方案中相对复杂,但效率最高的方案,推荐全部ISV采用。网络

经验分享

漏单问题
一、经过taobao.trades.sold.get和taobao.trades.sold.increment.get获取订单时,交易类型type入参默认只查询部分类型的订单,要查询全部类型的订单,必须显式提供全部交易类型做为type入参。
二、经过taobao.trades.sold.increment.get获取增量订单时,返回结果是按订单修改时间倒序排序的,分页必须从后往前翻,防止正向翻页过程当中订单发生变动而致使漏单。
三、经过taobao.trades.sold.increment.get获取增量订单时,每次获取的起始时间适当前移10分钟左右(双11大促时建议前移30分钟左右),防止极端状况下因为淘宝系统压力而致使订单延迟更新到数据库而产生的漏单。
四、经过主动通知接收订单变动消息时,须要处理服务器重启或网络断开链接而致使的消息丢失问题,详细内容请查看主动通知文档。
性能问题
一、taobao.trades.sold.get获取三个月已卖家的订单
a) 采用入参use_has_next=true的分页方式能够避免每次API请求对淘宝数据库产生的count(*),从而显著提高速度和稳定性。
b) 因为获取三个月内的订单接口是用建立时间过滤的,而建立时间是不可变的,因此从前日后翻页也不会致使漏单,于是能够省掉第一步的count(*),而直接采用入参use_has_next=true的方式分页获取,直到返回结果中has_next=false时终止翻页。
c) 若是接口返回的字段没法知足应用的须要,则强烈建议只获取fields=tid这一个字段,而后再经过taobao.trade.fullinfo.get获取订单详情。
d) 因为卖家三个月订单量比较大,建议把三个月的订单切分红按天获取,减小单次请求对淘宝数据库的记录扫描量,以提高效率。
二、taobao.trades.sold.increment.get获取增量订单
a) 采用入参use_has_next=true的分页方式能够避免每次API请求时对淘宝数据库产生的count(*),从而显著提高速度和稳定性。
b) 因为获取增量订单接口是用修改时间过滤的,而修改时间是可变的,因此须要从后往前翻页才能避免漏单。从后往前翻页必需要知道最后一页,因此必须在首次API请求时采用use_has_next=false方式统计订单总数,计算出总页数,而后再设置use_has_next=true终止订单统计,从后往前翻页。
c) 若是接口返回的字段没法知足应用的须要,则强烈建议只获取fields=tid这一个字段,而后再经过taobao.trade.fullinfo.get获取订单详情。
三、使用taobao.trades.sold.get/taobao.trades.sold.increment.get只获取tid字段时,建议设置page_size为最大值,减小API请求次数,提高效率。获取多个字段时可根据自身的网络状况设置page_size,建议设置为50左右。
异常处理
一、同步订单通常会采用多线程处理,因为API请求对APP是有频率限制的,因此设置线程池大小时,须要根据TOP容许的API调用频率来设置,避免限流后致使应用长时间没法调用API。
二、对于API返回的ISP类型的错误或网络链接错误,应用线程应该在休眠片刻中自动重试。而对于API返回的ISV类型的错误,应用须要记录日志以便往后排查,同时不要重试。多线程

示例代码

API接口文档及示例代码:http://open.taobao.com/doc2/apiList?spm=0.0.0.0.SJHRH3&cid=5app

 

文章做者: iitshare
本文地址:http://www.iitshare.com/taobao-shop-orders-synchronization.html
版权全部 © 转载时必须以连接形式注明做者和原始出处!异步

相关文章
相关标签/搜索