鍍金池/ 問(wèn)答/人工智能  HTML/ 請(qǐng)教微服務(wù)與分布式問(wèn)題

請(qǐng)教微服務(wù)與分布式問(wèn)題

現(xiàn)在用的是這兩個(gè)go-micro consul

有一個(gè)加減用戶積分的微服務(wù) <用戶微服務(wù)> 加減積分在服務(wù)中直接進(jìn)行

很多服務(wù)現(xiàn)在 依賴(lài) 用戶微服務(wù) ,現(xiàn)在怎么更新,重啟而不影響其他服務(wù)呢

如果啟動(dòng)兩個(gè)用戶實(shí)例, 兩個(gè)實(shí)例之間的用戶積分怎么同步呢

請(qǐng)問(wèn),你們都是怎么處理的呢

回答
編輯回答
礙你眼

分布式系統(tǒng)架構(gòu)中,分布式事務(wù)問(wèn)題是一個(gè)繞不過(guò)去的挑戰(zhàn)。而微服務(wù)架構(gòu)的流行,讓分布式事問(wèn)題日益突出!
下面我們以電商購(gòu)物支付流程中,在各大參與者系統(tǒng)中可能會(huì)遇到分布式事務(wù)問(wèn)題的場(chǎng)景進(jìn)行詳細(xì)的分析!
圖片描述
如上圖所示,假設(shè)三大參與平臺(tái)(電商平臺(tái)、支付平臺(tái)、銀行)的系統(tǒng)都做了分布式系統(tǒng)架構(gòu)拆分,按上數(shù)中的流程步驟進(jìn)行分析:
1、電商平臺(tái)中創(chuàng)建訂單:預(yù)留庫(kù)存、預(yù)扣減積分、鎖定優(yōu)惠券,此時(shí)電商平臺(tái)內(nèi)各服務(wù)間會(huì)有分布式事務(wù)問(wèn)題,因?yàn)榇藭r(shí)已經(jīng)要跨多個(gè)內(nèi)部服務(wù)修改數(shù)據(jù);
2、支付平臺(tái)中創(chuàng)建支付訂單(選銀行卡支付):查詢(xún)賬戶、查詢(xún)限制規(guī)則,符合條件的就創(chuàng)建支付訂單并跳轉(zhuǎn)銀行,此時(shí)不會(huì)有分布式事務(wù)問(wèn)題,因?yàn)檫€不會(huì)跨服務(wù)改數(shù)據(jù);
3、銀行平臺(tái)中創(chuàng)建交易訂單:查找賬戶、創(chuàng)建交易記錄、判斷賬戶余額并扣款、增加積分、通知支付平臺(tái),此時(shí)也會(huì)有分布式事務(wù)問(wèn)題(如果是服務(wù)化架構(gòu)的話);
4、支付平臺(tái)收到銀行扣款結(jié)果:更改訂單狀態(tài)、給賬戶加款、給積分帳戶增加積分、生成會(huì)計(jì)分錄、通知電商平臺(tái)等,此時(shí)也會(huì)有分布式事務(wù)問(wèn)題;
5、電商平臺(tái)收到支付平臺(tái)的支付結(jié)果:更改訂單狀態(tài)、扣減庫(kù)存、扣減積分、使用優(yōu)惠券、增加消費(fèi)積分等,系統(tǒng)內(nèi)部各服務(wù)間調(diào)用也會(huì)遇到分布式事問(wèn)題;
圖片描述
如上圖,支付平臺(tái)收到銀行扣款結(jié)果后的內(nèi)部處理流程:
1、支付平臺(tái)的支付網(wǎng)關(guān)對(duì)銀行通知結(jié)果進(jìn)行校驗(yàn),然后調(diào)用支付訂單服務(wù)執(zhí)行支付訂單處理;
2、支付訂單服務(wù)根據(jù)銀行扣款結(jié)果更改支付訂單狀態(tài);
3、調(diào)用資金賬戶服務(wù)給電商平臺(tái)的商戶賬戶加款(實(shí)際過(guò)程中可能還會(huì)有各種的成本計(jì)費(fèi);如果是余額支付,還可能是同時(shí)從用戶賬戶扣款,給商戶賬戶加款);
4、調(diào)用積分服務(wù)給用戶積分賬戶增加積分;
5、調(diào)用會(huì)計(jì)服務(wù)向會(huì)計(jì)(財(cái)務(wù))系統(tǒng)寫(xiě)進(jìn)交易原始憑證生成會(huì)計(jì)分錄;
6、調(diào)用通知服務(wù)將支付處理結(jié)果通知電商平臺(tái);
圖片描述
如上圖,把支付系統(tǒng)中的銀行扣款成功回調(diào)處理流程提取出來(lái),對(duì)應(yīng)的分布式事務(wù)問(wèn)題的代碼場(chǎng)景:
/ 支付訂單處理 /
@Transactional(rollbackFor = Exception.class)
public void completeOrder() {
orderDao.update(); // 訂單服務(wù)本地更新訂單狀態(tài)
accountService.update(); // 調(diào)用資金賬戶服務(wù)給資金帳戶加款
pointService.update(); // 調(diào)用積分服務(wù)給積分帳戶增加積分
accountingService.insert(); // 調(diào)用會(huì)計(jì)服務(wù)向會(huì)計(jì)系統(tǒng)寫(xiě)入會(huì)計(jì)原始憑證
merchantNotifyService.notify(); // 調(diào)用商戶通知服務(wù)向商戶發(fā)送支付結(jié)果通知
}

本地事務(wù)控制還可行嗎?

以上分布式事務(wù)問(wèn)題,需要多種分布式事務(wù)解決方案來(lái)進(jìn)行處理。

訂單處理:本地事務(wù)

資金賬戶加款、積分賬戶增加積分:TCC型事務(wù)(或兩階段提交型事務(wù)),實(shí)時(shí)性要求比較高,數(shù)據(jù)必須可靠。
圖片描述

會(huì)計(jì)記賬:異步確保型事務(wù)(基于可靠消息的最終一致性,可以異步,但數(shù)據(jù)絕對(duì)不能丟,而且一定要記賬成功)
圖片描述

商戶通知:最大努力通知型事務(wù)(按規(guī)律進(jìn)行通知,不保證數(shù)據(jù)一定能通知成功,但會(huì)提供可查詢(xún)操作接口進(jìn)行核對(duì))
圖片描述

推薦閱讀:https://www.roncoo.com/course...

2017年4月25日 19:13
編輯回答
愚念

這種是典型的分布式事務(wù)問(wèn)題,一般設(shè)計(jì)的時(shí)候盡量避免,使用數(shù)據(jù)庫(kù)的本地事務(wù)保證。另外兩個(gè)實(shí)例可以一個(gè)一個(gè)的重啟,保證流量有一個(gè)實(shí)例承載,通過(guò)注冊(cè)發(fā)現(xiàn)服務(wù)或nginx剔除實(shí)例。建議賬戶設(shè)計(jì)凍結(jié)、結(jié)算兩個(gè)步驟。通過(guò)最終一致性方案解決(通過(guò)MQ發(fā)送結(jié)算消息,再更新數(shù)據(jù)狀態(tài)和扣減積分),感覺(jué)這個(gè)服務(wù)叫“賬戶服務(wù)”更加貼切。:)

2017年11月18日 06:34