阅读笔记一
分布式架構(gòu)中數(shù)據(jù)一致性常見的幾個(gè)問題
針對(duì)分布式架構(gòu)下的數(shù)據(jù)一致性,可能會(huì)有如下問題:跨系統(tǒng)間分布式事務(wù)如何解決?系統(tǒng)內(nèi)多個(gè)服務(wù)的分布式事務(wù)如何解決?一個(gè)服務(wù)內(nèi)多個(gè)數(shù)據(jù)源/數(shù)據(jù)庫的分布式事務(wù)如何解決?這些問題很容易理解,但是由于術(shù)語不準(zhǔn)確,所以解釋起來會(huì)有二義性,所以先要統(tǒng)一語言或者術(shù)語。下面定義域的概念:域是一個(gè)虛擬的分類,幾個(gè)系統(tǒng)屬于某一個(gè)域,例如網(wǎng)上銀行和手機(jī)銀行都屬于電子渠道領(lǐng)域;
傳統(tǒng)的單體應(yīng)用,指的就是系統(tǒng),在微服務(wù)架構(gòu)下,單體應(yīng)用采用前后端分離模式,前端一般使用 Nginx,Ngnix 進(jìn)程間采用主備模式,系統(tǒng)的后端可以分為多個(gè)應(yīng)用,每個(gè)應(yīng)用有一組對(duì)等的應(yīng)用進(jìn)程(也稱為應(yīng)用實(shí)例)提供服務(wù),每個(gè)應(yīng)用對(duì)應(yīng)一個(gè)數(shù)據(jù)庫,實(shí)際上在分庫的情況下,有可能一個(gè)應(yīng)用對(duì)應(yīng)多個(gè)數(shù)據(jù)庫。復(fù)雜一點(diǎn)的是網(wǎng)關(guān),網(wǎng)關(guān)由一組對(duì)等的網(wǎng)關(guān)實(shí)例組成,如果多個(gè)系統(tǒng)共享一個(gè)網(wǎng)關(guān),網(wǎng)關(guān)和系統(tǒng)就是1對(duì)多的關(guān)系,也可以一個(gè)系統(tǒng)獨(dú)享一個(gè)網(wǎng)關(guān),就是一對(duì)一情況,下圖是一個(gè)概念的示例,使用的是系統(tǒng)獨(dú)享網(wǎng)關(guān)模式。
這里,我們看看經(jīng)常問的一些問題:跨系統(tǒng)間分布式事務(wù)、系統(tǒng)內(nèi)多個(gè)服務(wù)的分布式事務(wù)、一個(gè)服務(wù)內(nèi)多個(gè)數(shù)據(jù)源/數(shù)據(jù)庫的分布式事務(wù),這些問題完全是從技術(shù)的角度做歸納,用上述概念應(yīng)該改為:系統(tǒng)間的數(shù)據(jù)一致性、系統(tǒng)內(nèi)應(yīng)用間的數(shù)據(jù)一致性、應(yīng)用內(nèi)部對(duì)應(yīng)多數(shù)據(jù)庫的數(shù)據(jù)一致性,另外可以增加一個(gè)數(shù)據(jù)庫對(duì)應(yīng)多個(gè)應(yīng)用的數(shù)據(jù)一致性(技術(shù)上存在可能,但從上述概念上看應(yīng)該是在架構(gòu)上避免的)。
這四個(gè)情況如何處理呢?需要我們總結(jié)歸納,我在做總結(jié)歸納的時(shí)候,往往希望首先確定原則,這里的原則是從業(yè)務(wù)的角度進(jìn)行分析,而不是考慮技術(shù)的可能性,因?yàn)榧夹g(shù)的可能性無窮無盡,是一個(gè)無限組合,理論上任何情況都能發(fā)生,考慮所有情況就是胡扯了,必須根據(jù)業(yè)務(wù)的特征進(jìn)行歸納。這里,我不叫分布式事務(wù)而是數(shù)據(jù)一致性就是這個(gè)道理,從業(yè)務(wù)角度目標(biāo)是解決分布式情況下的數(shù)據(jù)一致性,而不是技術(shù)角度看的分布式事務(wù)。
有了這個(gè)原則,就可以分別分析這三種情況了:
1、系統(tǒng)間的數(shù)據(jù)一致性
需要服務(wù)實(shí)現(xiàn) TCC或者業(yè)務(wù)補(bǔ)償模式,由框架(業(yè)務(wù)協(xié)調(diào)器)自動(dòng)調(diào)用,減少人工參與,或者實(shí)現(xiàn)冪等服務(wù),反復(fù)投遞。這兩種方式都沒法做到數(shù)據(jù)的 100% 一致,在失敗的時(shí)候都需要有重試的機(jī)制,例如補(bǔ)償失敗要重試(這就是框架的好處),多次重試還是失敗,記錄失敗歷史,業(yè)務(wù)上人工處理。不要害怕人工處理,只要減少人工處理的機(jī)會(huì)就好了,在工行時(shí)就是提出人工干預(yù)比例降低若干個(gè)百分點(diǎn)作為目標(biāo)。
2、系統(tǒng)內(nèi)應(yīng)用間的數(shù)據(jù)一致性
這個(gè)可以使用華為 SAGA 的模式,也就是建立一個(gè)共享的事務(wù)協(xié)調(diào)器模式(雖然我對(duì)這個(gè)共享方式不喜歡,不是分布式嗎,為啥還搞出一堆集中式的東西,既然如此,為啥應(yīng)用間調(diào)用不能走網(wǎng)關(guān),要直連,說共享不好,到這里就是共享好了),好了,括號(hào)里是吐槽,簡(jiǎn)單的方式是用共享的事務(wù)協(xié)調(diào)器模式,記錄服務(wù)調(diào)用的事件,在合適的時(shí)機(jī)調(diào)用TCC和補(bǔ)償服務(wù)。
3、應(yīng)用內(nèi)部對(duì)應(yīng)多數(shù)據(jù)庫的數(shù)據(jù)一致性,是個(gè)反模式,不要做通用方案
一般來說,一個(gè)應(yīng)用對(duì)應(yīng)一個(gè)數(shù)據(jù)庫,不允許一個(gè)應(yīng)用對(duì)應(yīng)多個(gè)數(shù)據(jù)庫,多個(gè)數(shù)據(jù)庫的情況應(yīng)該分成多個(gè)應(yīng)用,通過服務(wù)調(diào)用方式解決,這是一個(gè)基本原則,否則就是一個(gè)反模式設(shè)計(jì)。但是,就是有很多人較真,一定問有這個(gè)情況你怎么解決,我的回答是架構(gòu)設(shè)計(jì)解決這個(gè)問題,在技術(shù)上不支持這種方式,讓設(shè)計(jì)者必須在架構(gòu)解決,而不是利用技術(shù)手段解決不合理的架構(gòu)設(shè)計(jì),否則后患無窮(這一點(diǎn)還是需要勇氣和堅(jiān)持的)。空口無憑,實(shí)例為證,一般我會(huì)舉搶紅包的例子。大家知道,搶紅包的并發(fā)非常高,又有數(shù)據(jù)一致性的要求,無論哪個(gè)互聯(lián)網(wǎng)公司,都是根據(jù)紅包 ID,把數(shù)據(jù)路由到一個(gè)數(shù)據(jù)庫中,用數(shù)據(jù)庫事務(wù)保證數(shù)據(jù)一致性,在銀行互聯(lián)網(wǎng)賬務(wù)系統(tǒng)(2類 3類戶)的情況,也是把同一賬務(wù)的數(shù)據(jù)路由到不同的數(shù)據(jù)庫中(見下圖)。還會(huì)提到一種情況,在分庫分表的時(shí)候,如果恰好數(shù)據(jù)分到了不同庫中,恰好要做一個(gè)批量的調(diào)整,恰好在一個(gè)事務(wù)中,如何解決。我認(rèn)為這種情況的發(fā)生,恰恰說明設(shè)計(jì)有問題,分庫的原則也是按業(yè)務(wù)拆分,不是用技術(shù)手段隨機(jī)分解,既然按業(yè)務(wù)拆分,批量處理的時(shí)候就應(yīng)該不是一個(gè)業(yè)務(wù)上的事務(wù),在技術(shù)上不提供這樣的實(shí)現(xiàn),才可以在架構(gòu)設(shè)計(jì)考慮問題。不排除在某個(gè)系統(tǒng)中可以做一些框架,解決上述問題,但是,這一定不是個(gè)通用的方案。
?
轉(zhuǎn)載于:https://www.cnblogs.com/messi2017/p/11055063.html
總結(jié)
- 上一篇: C++成员变量初始化顺序问题
- 下一篇: (转) 微软项目管理培训笔记(一)