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