轉載本文需註明出處:EAWorld,違者必究。
針對分佈式架構下的數據一致性,你們也許會問這樣的問題:跨系統間分佈式事務如何解決?系統內多個服務的分佈式事務如何解決?一個服務內多個數據源/數據庫的分佈式事務如何解決?……這些問題你們是很容易理解的,可是因爲術語不許確,因此解釋起來會有二義性,因此先要統一語言或者術語,也就是統一律念:
域是一個虛擬的分類,幾個系統屬於某一個域,例如網上銀行和手機銀行都屬於電子渠道領域;
傳統的單體應用,指的就是系統,在微服務架構下,單體應用採用先後端分離模式,前端通常使用 Nginx,Ngnix 進程間採用主備模式,系統的後端能夠分爲多個應用,每一個應用有一組對等的應用進程(也稱爲應用實例)提供服務,每一個應用對應一個數據庫,實際上在分庫的狀況下,有可能一個應用對應多個數據庫。複雜一點的是網關,網關由一組對等的網關實例組成,若是多個系統共享一個網關,網關和系統就是1對多的關係,也能夠一個系統獨享一個網關,就是一對一狀況,下圖是一個概念的示例,使用的是系統獨享網關模式。
這裏,咱們看看常常問的一些問題:跨系統間分佈式事務、系統內多個服務的分佈式事務、一個服務內多個數據源/數據庫的分佈式事務,這些問題徹底是從技術的角度作概括,用上述概念應該改成:系統間的數據一致性、系統內應用間的數據一致性、應用內部對應多數據庫的數據一致性,另外能夠增長一個數據庫對應多個應用的數據一致性(技術上存在可能,但從上述概念上看應該是在架構上避免的)。
這四個狀況如何處理呢?須要咱們總結概括,我在作總結概括的時候,每每但願首先肯定原則,這裏的原則是從業務的角度進行分析,而不是考慮技術的可能性,由於技術的可能性無窮無盡,是一個無限組合,理論上任何狀況都能發生,考慮全部狀況就是胡扯了,必須根據業務的特徵進行概括。這裏,我不叫分佈式事務而是數據一致性就是這個道理,從業務角度目標是解決分佈式狀況下的數據一致性,而不是技術角度看的分佈式事務。
有了這個原則,就能夠分別分析這四種狀況了:
前端
一、系統間的數據一致性數據庫
須要服務實現 TCC或者業務補償模式,由框架(業務協調器)自動調用,減小人工參與,或者實現冪等服務,反覆投遞。這兩種方式都無法作到數據的 100% 一致,在失敗的時候都須要有重試的機制,例如補償失敗要重試(這就是框架的好處),屢次重試仍是失敗,記錄失敗歷史,業務上人工處理。不要懼怕人工處理,只要減小人工處理的機會就行了,在工行時就是提出人工干預比例下降若干個百分點做爲目標。
後端
二、系統內應用間的數據一致性架構
這個可使用華爲 SAGA 的模式,也就是創建一個共享的事務協調器模式(雖然我對這個共享方式不喜歡,不是分佈式嗎,爲啥還搞出一堆集中式的東西,既然如此,爲啥應用間調用不能走網關,要直連,說共享很差,到這裏就是共享好了),好了,括號裏是吐槽,簡單的方式是用共享的事務協調器模式,記錄服務調用的事件,在合適的時機調用TCC和補償服務。
三、應用內部對應多數據庫的數據一致性,是個反模式,不要作通用方案併發
通常來講,一個應用對應一個數據庫,不容許一個應用對應多個數據庫,多個數據庫的狀況應該分紅多個應用,經過服務調用方式解決,這是一個基本原則,不然就是一個反模式設計。可是,就是有不少人較真,必定問有這個狀況你怎麼解決,個人回答是架構設計解決這個問題,在技術上不支持這種方式,讓設計者必須在架構解決,而不是利用技術手段解決不合理的架構設計,不然後患無窮(這一點仍是須要勇氣和堅持的)。空口無憑,實例爲證,通常我會舉搶紅包的例子。你們知道,搶紅包的併發很是高,又有數據一致性的要求,不管哪一個互聯網公司,都是根據紅包 ID,把數據路由到一個數據庫中,用數據庫事務保證數據一致性,在銀行互聯網帳務系統(2類 3類戶)的狀況,也是把同一帳務的數據路由到不一樣的數據庫中(見下圖)。還會提到一種狀況,在分庫分表的時候,若是剛好數據分到了不一樣庫中,剛好要作一個批量的調整,剛好在一個事務中,如何解決。我認爲這種狀況的發生,偏偏說明設計有問題,分庫的原則也是按業務拆分,不是用技術手段隨機分解,既然按業務拆分,批量處理的時候就應該不是一個業務上的事務,在技術上不提供這樣的實現,才能夠在架構設計考慮問題。不排除在某個系統中能夠作一些框架,解決上述問題,可是,這必定不是個通用的方案。框架
根據上圖,咱們的概念模型是由調整的,要多一個應用分區的狀況:
四、一個數據庫對應多個應用的數據一致性前後端分離
這種狀況常常也是一個反模式,既然是共享一個數據庫,把應用放在一塊兒就行了。若是真的有須要(例如一個模塊部署過於頻繁,單獨拆出來作一個應用),那也應該和多應用多數據庫同樣處理。分佈式
以上,便是我分析的分佈式架構下幾種不一樣狀況的數據一致性控制方式。微服務
關於做者:焦烈焱,普元信息CTO,致力於技術創新和金融創新解決方案研究。專一於企業技術架構領域,對分佈式環境的企業計算、 企業信息架構的規劃與實踐有着豐厚經驗,帶領普元技術團隊相繼在雲計算、大數據及移動開發領域取得多項突破,並主持中國工商銀行、中國建設銀行等多家大型企業技術平臺的規劃與研發。大數據
關於EAWorld:微服務,DevOps,數據治理,移動架構原創技術分享。長按二維碼關注!