訂單同步
背景
訂單是賣家的核心數據,賣家的許多日常工作都是圍繞著訂單展開,應用的基本功能就是要保證訂單即時、完整的展示在賣家面前。由於API請求依賴網絡,存在網路不穩定和同步時間長的問題,所以應用程式必須把淘寶的訂單資料同步到本地。如何才能快速、完整的把訂單同步到本地是本方案將要討論的問題。
訂單同步有兩種方式:1、透過api 同步 2、基於rds訂單同步服務 。本文主要分析使用api 同步訂單的場景,有關rds訂單同步使用方法,可參考//open.taobao.com/docs/doc.htm.htm?articleId=101587&docType=1&treeId=2
#
名詞解釋
#線上訂單:賣家三個月內已賣出的訂單。
增量訂單:相對已經同步到本地的訂單,凡是在淘寶上發生了變更的訂單就是增量訂單。
訊息服務:一種透過HTTP長連線即時向客戶端(應用程式)推送資料(交易)變更的管道。
API#介紹
#taobao.trades.sold.get - 取得三個月內已賣出的線上訂單,適用於使用者初始化的時候使用,ISV不應該用此介面來取得增量訂單。不建議使用或盡量少用此介面。
taobao.trades.sold.increment.get – 取得增量訂單,適用於使用者初始化後,增量同步發生變更的訂單,ISV不應該用此介面來取得三個月內的訂單。
taobao.trade.fullinfo.get - 取得單筆訂單詳情。
實作方案
#訂單同步主要分為初始化與增量取得兩個步驟:
1. 初始化是把3個月內的線上訂單全部同步回來,這個需要較長的時間;
2. 增量獲取則是把淘寶發生了變更的訂單同步回來,這個一般需要較短的時間。
下面的方案都會圍繞著如何初始化和增量獲取來講。
##2
################################## ###### ###############同步流程:########################## #######核心步驟:############################u###### ###### ###三個月資料:透過taobao.trades.sold.get取得3個月內到現在建立的訂單ID,###再透過######taobao.trade.fullinfo.get#### ##取得訂單詳情############### ###u #增量資料:透過taobao.trades.sold.increment.get取得從現在開始的增量訂單ID,再透過taobao.trade.fullinfo.get#取得訂單詳情
#適用範圍:
#適用於ISV測試訂單同步功能或生產環境的中小型賣家進行訂單同步。此方案比較低效,除非舊的應用更新成本很高,否則不建議大家使用,建議採用下面的方案。
#
#方案二
##同步流程:
############### 核心步驟:### ################### ##a)###### ######首先,透過######taobao.trades.sold.get######取得3個月內到昨天23:59:59已建立的訂單詳情###############u###### ######## 三個月資料:#######################################b) 然後,透過taobao.trades.sold.increment.get取得從今天00:00:00到現在的增量訂單ID,再透過taobao.trade .fullinfo.get取得訂單詳情
u# 增量資料:透過訊息服務用戶端即時監聽訂單變更訊息,再透過taobao.trade.fullinfo.get取得訂單詳情
#
##適用範圍:
適用於所有類型的賣家,是所有方案中相對複雜,但效率最高的方案,推薦所有ISV採用。
經驗分享
#漏單問題:
M 透過taobao.trades.sold.get和taobao.trades.sold.increment.get取得訂單時,交易類型type入參預設只查詢部分類型的訂單,要查詢所有類型的訂單,必須明確提供所有交易類型作為type入參。
M #透過taobao.trades.sold.increment.get取得增量訂單時,傳回結果是依訂單修改時間倒序排序的,分頁必須從後往前翻,防止正向翻頁過程中訂單發生變更而導致漏單。 #
M 通过taobao.trades.sold.increment.get获取增量订单时,每次获取的起始时间适当前移10分钟左右(双11大促时建议前移30分钟左右),防止极端情况下由于淘宝系统压力而导致订单延迟更新到数据库而产生的漏单。
M 通过主动通知接收订单变更消息时,需要处理服务器重启或网络断开连接而导致的消息丢失问题,详细内容请查看消息服务。
性能问题:
M taobao.trades.sold.get获取三个月已卖家的订单
n 采用入参use_has_next=true的分页方式可以避免每次API请求对淘宝数据库产生的count(*),从而显著提升速度和稳定性。
n 由于获取三个月内的订单接口是用创建时间过滤的,而创建时间是不可变的,所以从前往后翻页也不会导致漏单,因而可以省掉第一步的count(*),而直接采用入参use_has_next=true的方式分页获取,直到返回结果中has_next=false时终止翻页。
n 如果接口返回的字段无法满足应用的需要,则强烈建议只获取fields=tid这一个字段,然后再通过taobao.trade.fullinfo.get获取订单详情。
n 由于卖家三个月订单量比较大,建议把三个月的订单切分成按天获取,减少单次请求对淘宝数据库的记录扫描量,以提升效率。
M taobao.trades.sold.increment.get获取增量订单
n 采用入参use_has_next=true的分页方式可以避免每次API请求时对淘宝数据库产生的count(*),从而显著提升速度和稳定性。
n 由于获取增量订单接口是用修改时间过滤的,而修改时间是可变的,所以需要从后往前翻页才能避免漏单。从后往前翻页必须要知道最后一页,所以必须在首次API请求时采用use_has_next=false方式统计订单总数,计算出总页数,然后再设置use_has_next=true终止订单统计,从后往前翻页。
n 如果接口返回的字段无法满足应用的需要,则强烈建议只获取fields=tid这一个字段,然后再通过taobao.trade.fullinfo.get获取订单详情。
M 使用taobao.trades.sold.get/taobao.trades.sold.increment.get只取得tid欄位時,建議設定page_size為最大值,減少API請求次數,提升效率。取得多個欄位時可依自身的網路狀況設定page_size,建議設定為50左右。
例外處理:
#M 同步訂單一般會採用多執行緒處理,由於API請求對APP是有頻率限制的,所以設定執行緒池大小時,需要依照TOP允許的API呼叫頻率來設置,避免限流後導致應用長時間無法呼叫API。
M #對於API傳回的ISP類型的錯誤或網路連線錯誤,應用執行緒應該在休眠片刻中自動重試。而對於API傳回的ISV類型的錯誤,應用程式需要記錄日誌以便日後檢查,同時不要重試。
FAQ
- 關於此文件暫時還沒有FAQ