一、舊系統(tǒng)的現(xiàn)狀分析:
1)服務(wù)調(diào)用關(guān)系
2)接口梳理
訂單相關(guān)舊系統(tǒng)接口整理:
a、gamecatsdk服務(wù)
b仗扬、wechat服務(wù)
c、paysdk服務(wù)
d蕾额、paycenter服務(wù)
主要梳理的格式包括:
接口名稱(chēng)早芭;接口uri;接口被調(diào)用服務(wù)诅蝶;接口網(wǎng)絡(luò)訪問(wèn)(內(nèi)網(wǎng)還是外網(wǎng))退个;遷移后的服務(wù);重構(gòu)后新接口URI秤涩。
(具體的梳理省略帜乞,每個(gè)公司每個(gè)系統(tǒng)的情況各不一樣。)
3)ER關(guān)系圖
二筐眷、新系統(tǒng)的設(shè)計(jì)
1)ER圖:
2)域名依賴(lài)關(guān)系:
paycenter的域名是:paycenter.xxx.com
trade的域名是:trade.xxx.com
a黎烈、支付回調(diào)。為了支持舊系統(tǒng)已發(fā)起的支付(支付寶和微信)匀谣,在trade-nginx配置舊域名paycenter.xxx.com的調(diào)用照棋。也就是說(shuō),無(wú)論是paycenter.xxx.com還是trade.xxx.com都指向trade-nginx服務(wù)器武翎。
注意:在開(kāi)發(fā)測(cè)試環(huán)境里烈炭,trade服務(wù)需要開(kāi)通對(duì)外端口映射,讓支付機(jī)構(gòu)能夠回調(diào)到trade-nginx宝恶。
b符隙、IOS內(nèi)支付回調(diào),為了兼容舊版本的客戶(hù)端回調(diào)服務(wù)后端垫毙,之前是訪問(wèn)paycenter.xxx.com /notify/iosInnerPay霹疫,所以trade-nginx需要支持paycenter.xxx.com/notify/iosInnerPay。
3)數(shù)據(jù)遷移:
由于舊系統(tǒng)的訂單和代金券也是分庫(kù)分表综芥,需要先使用臨時(shí)表丽蝎,把之前的分庫(kù)聚合到一張臨時(shí)表。再根據(jù)主鍵ID%n的方式分到新的庫(kù)里膀藐。
在預(yù)防環(huán)境下執(zhí)行, 數(shù)據(jù)遷移分為三類(lèi)數(shù)據(jù)屠阻,包括基礎(chǔ)類(lèi)红省,訂單類(lèi)和支付類(lèi)。
等新服務(wù)上線(xiàn)驗(yàn)證無(wú)誤后国觉,執(zhí)行補(bǔ)償任務(wù)吧恃,把落在舊庫(kù)的訂單和支付等數(shù)據(jù)再次補(bǔ)償?shù)叫聨?kù)。
I麻诀、基礎(chǔ)數(shù)據(jù)
支付接口實(shí)現(xiàn) pay_api :
支付接口映射:pay_api_mapping
ios sdk商品:sdk_ios_goods
II蚜枢、支付數(shù)據(jù)
支付流水:pay_flow
支付通知:pay_notify
ios支付校驗(yàn) pay_ios_voucher_check
III、訂單數(shù)據(jù)
訂單:order_base
喵點(diǎn)訂單:catpt_order_detail
sdk訂單:sdk_order_detail
訂單索引表:order_es_index
訂單代金券使用表:order_use_coupon
4)因?yàn)橛唵畏謳?kù)分表了针饥,之前為了解決跨庫(kù)聚合問(wèn)題,引入的是訂單索引表需频。
后期引入分布式搜索引擎ElasticSearch丁眼。
mysql數(shù)據(jù)庫(kù)負(fù)責(zé)的是操作類(lèi),ES負(fù)責(zé)訂單查詢(xún)昭殉,分頁(yè)查詢(xún)等苞七。
做過(guò)分庫(kù)分表的重構(gòu)同學(xué),都得面臨解決舊庫(kù)與新庫(kù)的一致性問(wèn)題挪丢。常見(jiàn)的解決方案有:
I蹂风、停機(jī)部署
掛出停機(jī)公告,屆時(shí)進(jìn)行數(shù)據(jù)遷移乾蓬,待驗(yàn)證通過(guò)后惠啄,切流到新庫(kù)。
II任内、雙寫(xiě)到db和mq
歷史數(shù)據(jù)
增量數(shù)據(jù):保存在mq里撵渡,通過(guò)訂閱程序把增量數(shù)據(jù)補(bǔ)到新庫(kù)。
III死嗦、雙寫(xiě)到db和ES
采用cqrs思想趋距,把操作類(lèi)和查詢(xún)類(lèi)分離開(kāi)來(lái),新庫(kù)和舊庫(kù)都會(huì)寫(xiě)入ES, 避免查詢(xún)數(shù)據(jù)的同步延遲等問(wèn)題越除,保證用戶(hù)看到的訂單數(shù)據(jù)是實(shí)時(shí)的节腐,也不影響運(yùn)營(yíng)后臺(tái)的訂單管理。
mysql里的數(shù)據(jù)采用補(bǔ)償機(jī)制摘盆,把舊庫(kù)的增量數(shù)據(jù)同步到新庫(kù)翼雀。
建議方案三,可以不用停機(jī)部署骡澈,至于灰度策略問(wèn)題锅纺,等后續(xù)專(zhuān)門(mén)文章來(lái)討論。
在遷移期間肋殴,舊程序和舊庫(kù)表務(wù)必保留囤锉,不能刪除坦弟,否則會(huì)出現(xiàn)訂單或支付流水號(hào)找不到的錯(cuò)誤等等。新系統(tǒng)必須是對(duì)新舊的一個(gè)同時(shí)兼容官地,只有待程序運(yùn)行確保無(wú)誤后酿傍,再刪程序刪庫(kù)表。