京東虛擬業(yè)務(wù)多維訂單系統(tǒng)架構(gòu)設(shè)計
當(dāng)年白居易初到長安,拜見大儒顧況,老先生見名曰“長安米貴,居大不易”,當(dāng)讀到白居易所詩“野火燒不盡,春風(fēng)吹又生”時不禁贊嘆“有句如此,居天下有甚難”。
京東平臺隸屬虛擬平臺下基礎(chǔ)平臺組研發(fā)的公共基礎(chǔ)服務(wù)平臺,上承復(fù)雜非標(biāo)品商品模型,下接海量個性化訂單數(shù)據(jù),為虛擬平臺內(nèi)外設(shè)計的所有非標(biāo)準(zhǔn)結(jié)構(gòu)商品提供結(jié)構(gòu)個性化定制、發(fā)布、促銷、虛擬資產(chǎn)支付、結(jié)算、退款及訂單匯聚、流動、統(tǒng)計、展示等豐富解決方案,大大降低了電商行業(yè)非標(biāo)準(zhǔn)商品的業(yè)務(wù)開發(fā)復(fù)雜度。
本期為大家介紹京東平臺的重要產(chǎn)品之一虛擬訂單中心。
同主站常規(guī)實(shí)物訂單中心一樣,京東虛擬訂單中心定位于訂單數(shù)據(jù)的匯聚、變更及狀態(tài)維護(hù)等,目前已經(jīng)聚合了手機(jī)充值、加油卡、機(jī)票酒店、景點(diǎn)門票火車票、點(diǎn)卡頁游等大量虛擬商品和部分非虛擬商品的訂單詳情數(shù)據(jù),同時為京東主站訂單中心提供訂單展示,對接風(fēng)控、營銷等業(yè)務(wù)方提供訂單數(shù)據(jù)分析應(yīng)用等。
虛擬訂單中心的核心功能主要圍繞數(shù)據(jù)搬運(yùn)工(Hamal)產(chǎn)品運(yùn)行, Hamal是京東依托開源項(xiàng)目研發(fā)的MySQL數(shù)據(jù)庫binlog監(jiān)聽產(chǎn)品,在保證高可用的前提下實(shí)現(xiàn)了高指標(biāo)的監(jiān)聽轉(zhuǎn)換過程。
預(yù)備小知識1-Binlog
binlog是mysql數(shù)據(jù)庫開啟Row模式時提供的二進(jìn)制日志,以binlogEvent形式記錄對數(shù)據(jù)發(fā)生或潛在發(fā)生更改(事務(wù)開啟)的SQL語句和數(shù)據(jù),類似于oracle數(shù)據(jù)庫的歸檔日志,可以用來查看數(shù)據(jù)庫的變更歷史、數(shù)據(jù)庫增量備份和基于時間點(diǎn)的恢復(fù)及Mysql的復(fù)制等。
預(yù)備小知識2-同步監(jiān)聽原理
簡單說就是模擬mysql的主從復(fù)制過程,先偽造成slave向master庫發(fā)送COM_REGISTER_SLAVE命令注冊客戶端,這樣master才會發(fā)送binlogEvent;接著發(fā)送COM_BINLOG_DUMP命令,并指定binlog文件和Position信息,即可從Master庫獲得包含詳細(xì)數(shù)據(jù)的binlogEvent二進(jìn)制流,binlogEvent包含了所有數(shù)據(jù)庫的事件類型(DDL、DML、TCL、授權(quán)等)、庫表信息、字段信息和行數(shù)據(jù),余下的工作經(jīng)過過濾、解析、協(xié)議反序列化得到想要的訂單數(shù)據(jù)。
COM_BINLOG_DUMP命令格式如下:
- -COM_BINLOG_DUMP
- -4byte binlog-pos
- -2byte flags (BINLOG_DUMP_NON_BLOCK see sql/mysql_priv.h)
- -4byte slave-server-id
- -nul-term binlog name
- DML的binlogEvent類型如下:
- enumLog_event_type {
- /* ...... */
- WRITE_ROWS_EVENT = 23,
- UPDATE_ROWS_EVENT = 24,
- DELETE_ROWS_EVENT = 25,
- INCIDENT_EVENT= 26,
- HEARTBEAT_LOG_EVENT= 27,
- /* ...... */
- };
虛擬訂單中心的主要架構(gòu)如下:
Hamal作為虛擬訂單中心數(shù)據(jù)管道的入口,其首要的任務(wù)是保證數(shù)據(jù)庫數(shù)據(jù)變動的精準(zhǔn)消費(fèi),因此必須謹(jǐn)慎設(shè)計binlog的消費(fèi)記錄和異常消費(fèi)后續(xù)處理機(jī)制等。
健壯性和高可用 Hamal使用zookeeper集群管理監(jiān)聽實(shí)例和記錄binlog的消費(fèi)位置信息。對于目標(biāo)庫,多個Hamal實(shí)例在啟動時搶占該庫的映射節(jié)點(diǎn)以獲取監(jiān)聽權(quán)限,落選的實(shí)例則以熱備份形式監(jiān)聽zk對應(yīng)節(jié)點(diǎn)binlog位置信息,在遭遇服務(wù)不可用或宕機(jī)時,迅速通過搶占接力監(jiān)聽服務(wù)和binlog信息;Hamal也支持同時監(jiān)聽目標(biāo)庫的多個目標(biāo)從庫,冪等的消費(fèi)binlog以防止目標(biāo)庫單節(jié)點(diǎn)宕機(jī)故障。由此,多重防災(zāi)機(jī)制力保服務(wù)的72小時高可用及數(shù)據(jù)的完備性,目前穩(wěn)定提供日監(jiān)聽千萬行記錄,從未拋棄過一條訂單。
快消費(fèi)
Hamal采用類似TCP滑動窗口的binlogEvent消費(fèi)的Get和ACK機(jī)制:每次接收批量binlog記錄,并行解析數(shù)據(jù)的變更,發(fā)送JMQ消息后確認(rèn)消費(fèi)(ACK),以窗口長度作為binlogPosition的增長步調(diào)。Hamal通過自產(chǎn)自銷MQ消息方式繼續(xù)驅(qū)動訂單數(shù)據(jù)的后續(xù)業(yè)務(wù)處理,后續(xù)過程包含數(shù)據(jù)變更的去重、DML過濾、存儲等,同時也可以為風(fēng)控、營銷、訂單交易等系統(tǒng)提供個性化數(shù)據(jù)訂閱服務(wù)。這樣即可以解耦binlog消費(fèi)環(huán)節(jié)以加速消費(fèi),又可以隔離同步監(jiān)聽服務(wù)和業(yè)務(wù)邏輯。
讀寫分離
Hamal采集的訂單數(shù)據(jù)轉(zhuǎn)換成訂單模型后繼續(xù)流向虛擬訂單中心的三重存儲介質(zhì)中:傳統(tǒng)Mysql數(shù)據(jù)庫作為原始數(shù)據(jù)的第一重存儲,ES和緩存系統(tǒng)用于數(shù)據(jù)索引和分析,以實(shí)現(xiàn)讀寫分離。存儲訂單數(shù)據(jù)上,DAO模塊同樣使用消息隊列解耦,訂單數(shù)據(jù)存儲到數(shù)據(jù)庫后,以自產(chǎn)自銷JMQ的形式推送訂單數(shù)據(jù)到ES和緩存系統(tǒng)以輕量化存儲過程,減少多級存儲間耦合又能夠均衡集群負(fù)載。
多級搜索
作為數(shù)據(jù)管道出口,訂單網(wǎng)關(guān)系統(tǒng)(GW)對外提供了可定制模版數(shù)據(jù)或消息數(shù)據(jù)訂閱、數(shù)據(jù)分頁查詢、訂單搜索統(tǒng)計等服務(wù),是對接數(shù)據(jù)應(yīng)用的關(guān)鍵環(huán)節(jié)。網(wǎng)關(guān)系統(tǒng)實(shí)現(xiàn)了非常完備且強(qiáng)悍的多級平滑搜索過程,當(dāng)訂單搜索超時或失敗時立刻跳轉(zhuǎn)到下級搜索,降級搜索的結(jié)果反補(bǔ)上級數(shù)據(jù)源;如果虛擬訂單中心檢索失敗,搜索會落地到產(chǎn)品線數(shù)據(jù)庫做最終檢索,檢索成功則會反補(bǔ)該訂單到訂單中心的各級存儲中,檢索失敗則必然是單號有誤;當(dāng)虛擬訂單服務(wù)完全不可用時,網(wǎng)關(guān)搜索將直接降級到原產(chǎn)品線生產(chǎn)數(shù)據(jù)庫拉取訂單數(shù)據(jù)。多級檢索方案,保證最完善的用戶體驗(yàn)!
如今,歷經(jīng)兩次技術(shù)版本演進(jìn)和多次618、雙十一大促考驗(yàn)的虛擬訂單中心,接入的虛擬業(yè)務(wù)達(dá)30+,穩(wěn)定承載了虛擬平臺的核心訂單數(shù)據(jù),累計訂單數(shù)據(jù)已近10億,并不斷挑戰(zhàn)新高,正逐漸成為虛擬商品以及其他非標(biāo)準(zhǔn)商品融入京東電商主體系的重要通道。
【本文是51CTO專欄作者“張開濤”的原創(chuàng)文章,作者微信公眾號:開濤的博客( kaitao-1234567)】