目錄
- 系列總目錄
- 架構(gòu)演進(jìn)
- 防超售
- 單元化
- 平臺(tái)化
- 防超賣
- Mysql同步實(shí)現(xiàn)防超賣
- Redis同步實(shí)現(xiàn)防超賣
- 一致性
- Mysql同步實(shí)現(xiàn)防超賣的一致性
- Redis同步實(shí)現(xiàn)防超賣的一致性
- 參考文章
系列總目錄
架構(gòu)演進(jìn)
防超售
- 最開(kāi)始商品庫(kù)存只需要支撐LBS電商比如外面和閃購(gòu),這類電商由于是基于位置的服務(wù)川陆,所以品類有限栓辜,庫(kù)存有限,要實(shí)現(xiàn)防超賣,可以用mysql同步扣減庫(kù)存住诸。這種業(yè)務(wù)場(chǎng)景適合業(yè)務(wù)發(fā)展初期暑脆,快速迭代。
單元化
-
隨著業(yè)務(wù)的發(fā)展剂买,需要支持更高的QPS惠爽,更好的拓展性癌蓖,以及更強(qiáng)的容災(zāi)能力。要抗住流浪洪峰疆股,海量扣庫(kù)存费坊,萬(wàn)級(jí)TPS。原生Mysql并不能支撐旬痹,這里選用redis同步扣減附井,監(jiān)聽(tīng)AOF同步mysql的方案,長(zhǎng)久來(lái)說(shuō)自研采用MTSQL(美團(tuán)自研的sql + 相應(yīng)的降級(jí)方案解決)两残。整體架構(gòu)如下永毅,Cellar是KV存儲(chǔ),容災(zāi)的話就是多機(jī)房建設(shè)人弓,多IDC部署沼死。
平臺(tái)化
- 平臺(tái)化解決各個(gè)應(yīng)用測(cè)接入,并且能夠支持應(yīng)用側(cè)快速迭代崔赌,避免業(yè)務(wù)側(cè)提個(gè)簡(jiǎn)單改字段需求意蛀,平臺(tái)半個(gè)月才響應(yīng)。小業(yè)務(wù)復(fù)用大業(yè)務(wù)流程健芭,大業(yè)務(wù)兼容小業(yè)務(wù)流程县钥,避免各種if else。
- 平臺(tái)化應(yīng)該保證回歸只回歸自己業(yè)務(wù)線業(yè)務(wù)慈迈,代碼簡(jiǎn)潔不冗余若贮,這才是真正的平臺(tái)化。
- 平臺(tái)化整體架構(gòu), 可以看到各個(gè)業(yè)務(wù)側(cè)有自己的Redis MySQL ElasticSearch, 長(zhǎng)遠(yuǎn)來(lái)說(shuō)應(yīng)該是一種類似Skywalking的微內(nèi)核可插拔服務(wù)痒留。平臺(tái)提供SPI谴麦,業(yè)務(wù)側(cè)實(shí)現(xiàn),各個(gè)業(yè)務(wù)側(cè)獨(dú)立伸头,也就不會(huì)有業(yè)務(wù)側(cè)提個(gè)簡(jiǎn)單改字段需求匾效,平臺(tái)半個(gè)月才響應(yīng)。
-
參考文章中[vivo 評(píng)論中臺(tái)的流量及數(shù)據(jù)隔離實(shí)踐]指出可以設(shè)置通用業(yè)務(wù)通用的es redis mysql以適應(yīng)流量比較小的業(yè)務(wù)恤磷,隔離es redis mysql給流量比較大或者需求比較特殊的業(yè)務(wù)弧轧。做個(gè)折中。
防超賣
Mysql同步實(shí)現(xiàn)防超賣
-
這種方案支撐的TPS有限碗殷,性能有限精绎,適合最初QPS不高時(shí)的架構(gòu)。
- 庫(kù)存交易服務(wù)使用Mysql同步扣減庫(kù)存锌妻,DTS(開(kāi)源可以用canal)監(jiān)聽(tīng)增量binlog, 監(jiān)聽(tīng)到binlog后庫(kù)存異步服務(wù)記錄庫(kù)存流水代乃。
- 庫(kù)存異步服務(wù)會(huì)校驗(yàn)流水如果校驗(yàn)失敗,則會(huì)進(jìn)行補(bǔ)償處理,當(dāng)然如果庫(kù)存交易服務(wù)異常也會(huì)發(fā)補(bǔ)償消息搁吓,庫(kù)存異步服務(wù)進(jìn)行補(bǔ)償處理原茅。
- mysql這種解決方案,會(huì)有流水校驗(yàn)失敗的情況之一: 調(diào)用庫(kù)存服務(wù)的上游socket超時(shí)導(dǎo)致的不一致堕仔,又沒(méi)用分布式事物擂橘。
Redis同步實(shí)現(xiàn)防超賣
- 對(duì)于全城送,品類豐富摩骨,庫(kù)存豐富通贞,QPS高的防超賣使用redis同步扣減。
-
架構(gòu)如下:
- 庫(kù)存交易服務(wù)同步lua腳本到redis恼五,然后扣減成功發(fā)送流水MQ昌罩,如果提交異常則發(fā)補(bǔ)償MQ。
- 庫(kù)存流水服務(wù)監(jiān)聽(tīng)redis的AOF庫(kù)存流水灾馒,然后批量聚合到mysql茎用。
一致性
Mysql同步實(shí)現(xiàn)防超賣的一致性
-
架構(gòu)
- 如果binlog積壓或者DTS故障導(dǎo)致redis,庫(kù)存異步服務(wù)數(shù)據(jù)老舊睬罗,可以通過(guò)延遲處理解決轨功,DTS可以通過(guò)雙通道(如圖DTS一個(gè)主通道,美團(tuán)BCP備用通道)保證容达。
- 如果redis夯辖,庫(kù)存異步服務(wù)數(shù)據(jù)丟失,那就重新加載董饰,庫(kù)存異步服務(wù)有個(gè)校驗(yàn)線程。
Redis同步實(shí)現(xiàn)防超賣的一致性
-
架構(gòu)
- redis集群主從可能會(huì)有主從不一致的情況圆米,比如master更新后master的AOF還沒(méi)來(lái)得及同步給slave卒暂,master宕機(jī),slave升級(jí)為master娄帖∫察簦可通過(guò)雙通道流水校驗(yàn),庫(kù)存校正處理近速。當(dāng)然長(zhǎng)遠(yuǎn)來(lái)看最好的方式是重構(gòu)Redis raft協(xié)議诈嘿,但這成本相對(duì)比較大。
- redis某個(gè)IDC下集群完全宕機(jī)削葱,這時(shí)觸發(fā)庫(kù)存不存在奖亚,雙通道校驗(yàn),不存在重新加載修正析砸。
參考文章
- 參考自小程序MTDPSalon第60期之 [美團(tuán)到家商品庫(kù)存演進(jìn)]
- vivo 評(píng)論中臺(tái)的流量及數(shù)據(jù)隔離實(shí)踐