上一篇中我們詳細分析了分布式事務,以及分布式事務的兩種實作方案,二階段送出和三階段送出。他們都是滿足了事務的ACID特性。但是,他們都有共同的缺點:同步阻塞,系統性能低以及沒有解決資料不一緻的問題。那今天我們來學另一種方案,基于消息的實作方式。
01
基于分布式消息的最終一緻性方案
在eBay分布式系統中,架構師們解決一緻性問題的核心方法論是:将需要分布式處理的事務通過消息的方式進行異步處理,然後根據業務規則自行進行失敗重試。現在,我們知道了需要有個核心元件,那就消息中間件,通過消息中間件進行分布式系統中各個消息的傳遞動作如下圖:

我同樣以我們使用者電商購物下單為例,期間涉及到訂單系統、支付系統、倉庫系統,他們彼此的協作時序圖如下:
然後,我們看看它基于消息的最終一緻性方案,整個流程是這樣的:
- 訂單系統将要處理訂單的消息發送到消息中間件MQ中,消息狀态為“待确認”。
- 消息中間件MQ将訂單系統發來的消息進行持久化存儲操作,即在MQ中增加一個“待發送”的消息。
- 消息中間件MQ将持久化結果傳回給訂單系統,如果成功,訂單系統則進行建立訂單操作,失敗則放棄本次創單操作。
- 訂單系統完成訂單的相關操作後,将結果(成功或者失敗)再發給消息中間件MQ。
- 消息中間件收到上面消息後,則進行相應的處理,如果失敗消息,則終止本次交易,删除MQ消息;如果是成功則更新MQ中消息狀态為可發送,就會将消息發送到支付系統。
- 支付系統收到消息還是按照上面傳遞步驟進行同樣的操作進行支付
- 支付系統将支付消息發給MQ,然後MQ将消息發給訂單系統,訂單系統進行調用庫存系統業務。
是以,基于分布式消息最終一緻性方案,一樣是依據分布式系統中所有事務均成功則整個交易流程才成功的原則。其實,在我們大部分網際網路項目中在應對分布式事務的時候,都會先犧牲下少許的資料不一緻,來做成最終資料一緻性的方案,遵從的是BASE理論。
02
什麼是BASE理論
既然說到了消息最終一緻性遵從BASE理論,我覺得有必要将BASE理論科普下。
BASE:全程是,Basically Avaliable(基本可用),Soft state(軟狀态),Eventually consistent(最終一緻性)三個短語的縮寫,來自eBay的架構師提出。
- Basically Avaliable:就是在分布式系統環境中,允許犧牲掉部分不影響主流程的功能的不可用,将其降級以確定核心服務的正常可用。
- Soft state:就是指在事務中,我們允許系統存在中間狀态,且并不影響我們這個系統。就拿資料庫的主從複制來說,是完全允許複制的時候有延時的發生的。
- Eventually consistent:還是以資料庫主從複制為例說,雖然主從複制有小延遲,但是很快最終就資料保持一緻了。
現在,我們将上篇(不好意思,懂分布式事務的你真的很了不起,上篇)中的二階段送出、三階段送出以及今天所說的基于分布式消息的最終一緻性方案,基于其各自相關特點做一比較。
最後,我們再整體回顧下分布式事務的三種實作方式,整理個思維導圖,幫助大家根據自己的業務進行合理的選擇哪一種方案來實作自己公司的分布式事務:
總結,今天分享了分布式事務基于分布式消息最終一緻性的方案,該方案是遵從BASE理論,并将BASE理論做了科普,然後對比了上篇将的二階段送出和三階段送出,這三種方案均是可以被用在生産的,看自己的項目進行選擇,二階段和三階段是強制性算法,是以,你的項目如果對于一緻性比較嚴格就才去這這方案;而消息最終一緻性是可以容忍系統的部分不一緻的,但是最終是一緻的,比如上面我講的我們公司的案例就是這樣的使用了最終一緻性方案。
下一集預告:就是把我們的分布式鎖的開發方案給大家分享,敬請期待哈
關于架構師修煉
本号旨在分享一線網際網路各種技術架構解決方案,分布式以及高并發等相關專題,同時會将作者的學習總結進行整理并分享。
更多技術專題,敬請期待