內(nèi)容來源:2017年4月22日,貝法易集團(tuán)技術(shù)部總監(jiān)黃亮在“2017年MongoDB中文社區(qū)深圳用戶組大會(huì)”進(jìn)行《MongoDB在跨境電商物流供應(yīng)鏈系統(tǒng)中的實(shí)踐》演講分享。IT 大咖說作為獨(dú)家視頻合作方,經(jīng)主辦方和講者審閱授權(quán)發(fā)布。
閱讀字?jǐn)?shù):2896 | 4分鐘閱讀
摘要
本次介紹下出口易跨境電商物流供應(yīng)鏈系統(tǒng)從單體應(yīng)用過渡到面向服務(wù)的分布式系統(tǒng)架構(gòu)的過程中,遇到的一些挑戰(zhàn)和實(shí)現(xiàn)。其中包括了基于MongoDB建模和數(shù)據(jù)持久化方面上具體實(shí)踐。
嘉賓演講視頻回顧及PPT:http://t.cn/R82rZLw
關(guān)于出口易物流
出口易物流是廣州市貝法易商貿(mào)有限公司(簡(jiǎn)稱貝法易)旗下,以全球倉(cāng)儲(chǔ)為核心,整合全球物流網(wǎng)絡(luò)系統(tǒng),為跨境電商賣家提供海外倉(cāng)儲(chǔ)、國(guó)際專線、國(guó)際小包、國(guó)際快遞、FBA頭程等物流服務(wù)以及本地化售前售后服務(wù),解決訂單管理、金融融資難題。我們不是物流的供應(yīng)商,我們是跨境電商全程物流解決方案提供商。
我們公司的重資產(chǎn)是人員,我們了解跨境電商物流,包括跨境電商通關(guān)的環(huán)節(jié)、關(guān)于物流方面的國(guó)際法律以及離境品的相關(guān)信息,這些都是我們公司最寶貴的資源。
我們公司底下有一大群長(zhǎng)期合作的供應(yīng)商,這是我們最大的優(yōu)勢(shì)。我們的難點(diǎn)也是在于這些供應(yīng)商是不可控的,因?yàn)槲覀兪窃谑褂脛e人家的服務(wù)。
所以除了訂單系統(tǒng)還有一個(gè)很重要的資產(chǎn)就是我們自營(yíng)的海外倉(cāng)儲(chǔ),這也是我們最核心的價(jià)值。
覆蓋歐美澳主要市場(chǎng)的服務(wù)網(wǎng)絡(luò)
上圖是我們?nèi)虿季值奈锪骶W(wǎng)絡(luò)。這些倉(cāng)儲(chǔ)有大有小,英國(guó)倉(cāng)庫(kù)是我們最核心的倉(cāng)庫(kù)。截至2017年,在國(guó)內(nèi)我們一共有八個(gè)倉(cāng)儲(chǔ)中心,重點(diǎn)的是在深圳、廣州和上海。
全球主流電商平臺(tái)重點(diǎn)推薦物流服務(wù)提供商
我們合作的平臺(tái)推薦我們的物流服務(wù)提供商有Amazon、ebay、wish、阿里國(guó)際、shopee、AliExpress還有LAZADA。
出口易新老架構(gòu)演變過程
我們之前的系統(tǒng)是上圖左邊的架構(gòu),針對(duì)商家第三方的ERP和一些商家自己研發(fā)的一套系統(tǒng),還有一些平臺(tái)跟我們的系統(tǒng)都是有直接交互。有的是通過出口易提供了一套UI來進(jìn)行訪問,還有就是大量的線上發(fā)貨,我們會(huì)采用API來進(jìn)行接入。我們后臺(tái)有admin管理后臺(tái),還有單獨(dú)的一塊WMS系統(tǒng)。
我們認(rèn)為這個(gè)系統(tǒng)有些過于龐大,想做一些調(diào)整。新的架構(gòu)大部分還是沒有改動(dòng),只是在后端針對(duì)admin的系統(tǒng)想要往面向服務(wù)架構(gòu)方向落地。基于業(yè)務(wù)場(chǎng)景的切分有兩塊,一塊是基于通用服務(wù),比如說用戶的認(rèn)證和授權(quán),還有就是日志。
支付有一些支付網(wǎng)關(guān),有和paypal、alipay、payoneer還有銀行的接口。
下面是我們業(yè)務(wù)最主要模塊,包括產(chǎn)品報(bào)價(jià)、客戶關(guān)系管理系統(tǒng),還有訂單、物流網(wǎng)絡(luò)和運(yùn)輸,包括WMS、支付、物流軌跡跟蹤、供應(yīng)商管理系統(tǒng),還有結(jié)算報(bào)表等等諸如此類。
出口易老業(yè)務(wù)系統(tǒng)特點(diǎn)
單體應(yīng)用:前后端系統(tǒng)共用一套WEB App Solution。
單一數(shù)據(jù)庫(kù):采用MS SQLServer 數(shù)據(jù)庫(kù),核心業(yè)務(wù)功能共用一個(gè)數(shù)據(jù)庫(kù)。
業(yè)務(wù)功能完整:IT系統(tǒng)隨業(yè)務(wù)的發(fā)展不斷擴(kuò)展新功能。滿足開展跨境電商物流業(yè)務(wù)最基本的功能性需求。
容易測(cè)試和部署:?jiǎn)为?dú)一個(gè)Solution,系統(tǒng)依賴少,一旦部署,全部功能即可測(cè)試。
出口易老業(yè)務(wù)系統(tǒng)不足
不夠靈活:對(duì)應(yīng)用程序做任何細(xì)微的修改都需要將整個(gè)應(yīng)用程序重新構(gòu)建、重新部署。
妨礙持續(xù)交付:系統(tǒng)規(guī)模大,構(gòu)建和部署時(shí)間也相應(yīng)地比較長(zhǎng),不利于頻繁部署,阻礙持續(xù)交付。
受技術(shù)棧限制:包括開發(fā)語(yǔ)言,開發(fā)工具,數(shù)據(jù)庫(kù)一旦選定,無法根據(jù)實(shí)際需要作其他選擇。
技術(shù)負(fù)債:系統(tǒng)邏輯異常復(fù)雜,隨著時(shí)間推移,人員更迭,技術(shù)負(fù)債不斷累積。
出口易新業(yè)務(wù)系統(tǒng)特點(diǎn)
面向服務(wù):根據(jù)業(yè)務(wù)模塊切分不同的系統(tǒng)模塊,系統(tǒng)模塊采用面向服務(wù)架構(gòu)。服務(wù)與服務(wù)通過明確的接口定義進(jìn)行通訊。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):每個(gè)業(yè)務(wù)模塊團(tuán)隊(duì)負(fù)責(zé)一個(gè)領(lǐng)域或業(yè)務(wù)功能相關(guān)的全部開發(fā)。核心領(lǐng)域根據(jù)DDD中明確定義的規(guī)則實(shí)現(xiàn)。
獨(dú)立部署、升級(jí)、擴(kuò)展和替換:每個(gè)服務(wù)可以單獨(dú)部署,透明升級(jí),不影響整個(gè)系統(tǒng)。
異構(gòu)/采用多種語(yǔ)言:每個(gè)服務(wù)開發(fā)團(tuán)隊(duì),可以選擇自己熟悉開發(fā)語(yǔ)言,數(shù)據(jù)庫(kù),開發(fā)工具和開發(fā)架構(gòu)。
新架構(gòu)落地的切入點(diǎn)
身份認(rèn)證:每個(gè)服務(wù)都需要統(tǒng)一的登錄認(rèn)證。
鑒權(quán):不同的用戶使用相同的服務(wù)模塊都需要鑒權(quán)。
由單點(diǎn)登錄的頁(yè)面包括基于OAuth2 API這樣的方式來接入。內(nèi)部采用的是DDD這樣的一個(gè)邏輯架構(gòu),包括應(yīng)用層、領(lǐng)域?qū)印nI(lǐng)域?qū)永锩嬗职祟I(lǐng)域模型、實(shí)體子對(duì)象、領(lǐng)域服務(wù)、領(lǐng)域事件和查詢的規(guī)格。
基于倉(cāng)儲(chǔ),要存一個(gè)訂單,必須連接實(shí)體和子對(duì)象一起存儲(chǔ)刷新到數(shù)據(jù)庫(kù)。
我們做應(yīng)用的時(shí)候更偏向于完成業(yè)務(wù),所以選用了mangoDB。我們有一套自己的架構(gòu),在封裝的過程中就會(huì)把mangoDB做一層封裝。
上圖中面向切面的架構(gòu)包括了exertion、loading和cache等切面。
上圖是TMS系統(tǒng)調(diào)撥單聚合根示意圖,它包括了物流軌跡的集合、預(yù)計(jì)到貨時(shí)間等信息,還有這些調(diào)撥單歷經(jīng)的節(jié)點(diǎn)信息。
為什么選擇MongoDB?
1、非事務(wù)緊密型。錯(cuò)誤數(shù)據(jù)容忍性相對(duì)比較高。
2、團(tuán)隊(duì)成員有使用MongoDB開發(fā)經(jīng)驗(yàn)。對(duì)基于MongoDB方面的建模需要考慮的必要冗余有一定的了解。
3、Portal 模塊數(shù)據(jù)庫(kù)讀大于寫,基于MongoDB讀寫方面的高性能,解決了高并發(fā)下系統(tǒng)卡頓問題。
4、TMS 系統(tǒng)模型之間關(guān)系復(fù)雜,采用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù),勢(shì)必增加一堆表。采用MongoDB,可以把復(fù)雜的模型,通過一個(gè)Doucment存儲(chǔ)到一起。
基于MongoDB開發(fā)需要注意的問題
集合之間不能Join,建模方面要特別注意。建議增加必要的冗余,減少二次查詢。
僅僅支持單個(gè)Document級(jí)別事務(wù)。數(shù)據(jù)一致性錯(cuò)誤時(shí),要考慮增加必要數(shù)據(jù)監(jiān)控和數(shù)據(jù)修復(fù)功能。
聚合查詢,需要通過MongoDB 聚合管道方式查詢,MongoDB C# 驅(qū)動(dòng)提供了良好支持,但是相對(duì)Linq查詢還是比較繁瑣。
基于MongoDB的持久化實(shí)現(xiàn)
一、倉(cāng)儲(chǔ)Repository
倉(cāng)儲(chǔ)限定在對(duì)整個(gè)聚合根的操作上,提供聚合根的持久化和重建或查詢。
二、倉(cāng)儲(chǔ)上下文Repository Context
負(fù)責(zé)事務(wù)處理。每個(gè)聚合根的倉(cāng)儲(chǔ)都會(huì)關(guān)聯(lián)到同一個(gè)倉(cāng)庫(kù)上下文。但是MongoDB 不支持事務(wù),我們提供了虛擬實(shí)現(xiàn)。倉(cāng)儲(chǔ)上下文應(yīng)用了工作單元模式。
一些關(guān)注點(diǎn)
一、領(lǐng)域模型采用POCO(POJO)
簡(jiǎn)單的CLR對(duì)象(簡(jiǎn)單的Java對(duì)象),不繼承任何持久化框架中的基類,或?qū)崿F(xiàn)任何持久化框架中的接口。領(lǐng)域?qū)硬灰肕ongoDB類庫(kù)。MongoDB倉(cāng)庫(kù)層使用lambda expression 實(shí)現(xiàn)類的Map。
二、ID 生成器
有多種ID生成器可供選擇。GuidGenerator,OjbectIdGenerator,String OjbectIdGenerator,etc。我們ID一律使用String類型。所以直接使用MongoDB的StringObjectIdGenerator。
三、多態(tài)類的Map
如果把多態(tài)類(繼承)映射到MongoDB,需要指定已知類型。
四、一些需要了解的約定
NamedIdMemberConvention可以指定類的哪些屬性可以作為ID。
IgnoreExtraElementsConvention可以忽略Document中不存在于類中的字段,否則會(huì)拋出異常。
EnumRepresentationConvention可以指定枚舉序列化的方式,我們都指定為BsonType.String。
MongoDB聚合框架(C#)
一、聚合框架
MongoDB2.2版本引入了此功能,是數(shù)據(jù)聚合的一個(gè)新框架。
這個(gè)框架一是對(duì)文檔進(jìn)行“過濾”,也就是篩選出符合條件的文檔;二是對(duì)文檔進(jìn)行“變換”,也就是改變文檔的輸出形式。其他的也包括按照某個(gè)指定字段分組和排序等。
它其實(shí)是MapReduce的替代方案,但比MapReduce簡(jiǎn)單。
該框架使用聲明性管道符號(hào)來支持類似SQL 中的Group by 操作的功能。不需要自己編寫自定義的JavaScript。
二、管道操作符
$project:數(shù)據(jù)投影,主要用于重命名、增加和刪除字段。
$match:過濾操作,篩選符合條件文檔,作為下一階段的輸入。
$limit:限制經(jīng)過管道的文檔數(shù)量。
$skip:從待操作集合開始的位置跳過文檔的數(shù)目。
$unwind:將數(shù)組元素拆分為獨(dú)立字段。
$group:對(duì)數(shù)據(jù)進(jìn)行分組。
$sort:對(duì)文檔按照指定字段排序。
$geoNear:會(huì)返回一些坐標(biāo)值,這些值以按照距離指定點(diǎn)距離由近到遠(yuǎn)進(jìn)行排序。這個(gè)在地理信息系統(tǒng)中比較常用。
總結(jié)
對(duì)于大多數(shù)的聚合操作,聚合管道可以提供很好的性能和一致的接口。
使用起來比較簡(jiǎn)單,和MapReduce一樣,它也可以作用于分片集合。
輸出的結(jié)果只能保留在一個(gè)文檔中,要遵守BSON Document大小限制(當(dāng)前是16M)。
管道對(duì)數(shù)據(jù)的類型和結(jié)果的大小會(huì)有一些限制,對(duì)于一些簡(jiǎn)單的固定的。
聚集操作可以使用管道,但是對(duì)于一些復(fù)雜的、大量數(shù)據(jù)集的聚合任務(wù)還是使用MapReduce。
今天的分享就到這里,謝謝大家!
新時(shí)代鞋服物流與供應(yīng)鏈面臨的變革和挑戰(zhàn)03月07日 20:38
點(diǎn)贊:這個(gè)雙11,物流大佬一起做了這件事11月22日 21:43
物流管理機(jī)構(gòu)及政策分布概覽12月04日 14:10
盤點(diǎn):2017中國(guó)零售業(yè)十大事件12月12日 13:57
2017年中國(guó)零售電商十大熱點(diǎn)事件點(diǎn)評(píng)12月28日 09:58