1. 程式人生 > >服務化架構下的資料一致性如何保證

服務化架構下的資料一致性如何保證

在系統服務化的過程中,我們不得不面臨的一個問題是多個子系統間業務資料的一致性如何保證,解決這個問題有多種方式。

XA

可能很多人首先會想到XA規範中定義的分散式事務,下圖是XA規範中定義的DTP(Distributed Transaction Processing)模型:
這裡寫圖片描述
但該模式並不適用於如今的網際網路應用,主要有以下幾點問題:
1. XA採用2PC,並不能完全保證一致性;
2. 2PC有同步阻塞問題,並且增加了2次RTTs(round trip times),效能低下;
3. 服務化架構天然與DTP模型相悖,服務化架構顯然是面向服務的,為了解決資料一致性,直接向對方暴露資料庫,這還是服務化嗎?

本地訊息表+MQ

既然分散式事務不行,我們自然想到了本地事務,可以利用本地事務的ACID特性來保證一致性,資料儲存之後,再想辦法將資料傳輸給其它系統,做之後的業務處理,如果處理失敗,還可以重試。這個過程實現起來並不難,並且有多種實現方式,但每個系統自己去搞成本還是很高的,所以我們追求的是一種通用且相對優雅的方式。目前業界多數都採用本地訊息表+MQ的方式,本地訊息表設計成一種通用的結構,與業務模型無關,將其放到業務庫同例項上,這樣就可以保證業務操作和儲存訊息在同一個事物內,其它執行緒讀取訊息表資料,傳送到MQ Server(broker),傳送成功則刪除資料,失敗則保留資料,後續會不斷重試,直至成功。隨後MQ Server進行廣播通知其它系統,做後續處理,如果處理失敗,MQ Server負責重試。
這裡寫圖片描述


上面的流程看起來對業務侵入也比較大,但我們可以通過一些手段來遮蔽這些細節:

  • 首先,我們要搭建一個公共的MQ Server;
  • 其次,我們要預先在業務庫去建立一個訊息表,可以通過運維的手段解決;
  • 最後,我們要提供一個拆箱即用的Message Producer API,遮蔽傳送訊息的細節,Message Consumer API直接用MQ原生的即可。
@Transactional
public void doSth(Object obj) {
    xxxDao.insert(obj);// 1.biz operation
    Message msg = buildMessage(obj);
    messageProducer.sendMessage(msg);// 2.store msg
}

這套機制從0搭建起來還是需要較大成本的,但搭建完之後將一勞永逸,算是先苦後甜吧。

RocketMQ

那有沒有現成的解決方案呢?答案是有的,那就是今年風頭很盛的RocketMQ(已成為Apache頂級專案),RocketMQ在其商業版中提供了事物型訊息,所謂事物型訊息就是保證了業務操作和傳送訊息滿足一致性(業務操作成功,訊息一定傳送成功,業務操作失敗,訊息一定未傳送,反之也成立),上面描述的方式(本地訊息表+MQ)就可以看作是事物型訊息,下面引用一下阿里中介軟體團隊部落格中的描述。

這裡的事務訊息指的其實是資料傳送者事務訊息,簡單而言就是在真正地做業務邏輯之前會發送一條半訊息到服務端,接下來發送者會執行本地的事務,在完成本地事務之後,如果成功就會向服務端傳送一條確認資訊,這時候服務端會將之前的半訊息事務狀態進行變更;如果失敗了,服務端就會不斷地回撥客戶端,來保證傳送端的事務一致性。
這裡寫圖片描述
http://jm.taobao.org/2017/03/09/20170309/

這裡的關鍵點是第三步如果失敗,要依靠第四步broker回撥客戶端來保證一致性,這裡猜測一下其大概實現,客戶端傳送訊息前,會新增一個事物檢查的實現,並開通一個埠,broker回撥時會攜帶著topic、message等資訊,客戶端依據message資訊和自己的業務資料判定是提交或者回滾,可能有些業務場景依據這兩個資訊無法判定,那客戶端依然要建立本地訊息表。

其它方案

其它方案大多缺失普適性,比如TCC(Try/Confirm/Cancel),適用於金融領域。

相關推薦

服務化架構資料一致性如何保證

在系統服務化的過程中,我們不得不面臨的一個問題是多個子系統間業務資料的一致性如何保證,解決這個問題有多種方式。 XA 可能很多人首先會想到XA規範中定義的分散式事務,下圖是XA規範中定義的DTP(Distributed Transaction Proce

微服務架構資料一致性保證(二):可靠事件模式

第一篇分享中講到實現可靠事件模式的關鍵在於:可靠事件投遞和避免事件重複消費,其中避免事件重複消費需要微服務滿足冪等性。那麼又該如何實現可靠事件投遞?又該如何保證服務滿足冪等性? 轉載本文需註明出處:EAII企業架構創新研究院,違者必究。如需加入微信群參與微課堂、架構設計與討論直播請

微服務架構資料一致性保證

從2014年開始,微服務逐漸進入大家的實現,被認為是下一代實現資訊化的有效手段。設計到系統,其中繞不開的就是資料一致性,從本地事務,到後來的分散式事務,都能夠有效的保證資料一致性。但是在微服務架構中,這兩種方式都不是最好的選擇。 1. 使用本地事務和分散式事務保證一致性

微服務架構資料一致性保證(一)

大家好,今天我給大家分享的題目是微服務架構下的資料一致性保證。 今天分享第一篇,主要內容包括: 1.傳統使用本地事務和分散式事務保證一致性。 2.傳統分散式事務不是微服務中一致性的最佳選擇。 3.微服務架構中應滿足資料最終一致性原則。 4.微服務架構實現

微服務架構資料一致性保證(三):補償模式

在微服務架構下,一個典型的業務操作往往由一系列自治的微服務步驟組成,如果某個步驟發生了業務異常(比如支付時賬戶餘額不足等)時就出現了資料不一致。我們採用補償模式來撤銷已經完成的步驟,從而實現最終一致性。 今天分享的還是關於微服務架構下的資料一致性保證的話題,是資料一

分散式系統資料一致性解決之分散式事務

一、定義 參考百度百科定義: 分散式事務是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。 二、分散式事務的理論 2.1 CAP理論 CAP 是指在一個分散式系統下, 包含三個要素:Consistency(一致性)、

分散式環境資料一致性的設計總結

相關理論: 在聊分散式環境下資料一致性問題之前我們先看一個理論(事務的ACID一定要知道的)CAP理論: CAP理論由加州大學伯克利分校的計算機教授Eric Brewer在2000年提出,其核心思想是任何基於網路的資料共享系統最多隻能滿足資料一致性(Consistency)、可用性(Availabilit

億級流量系統架構之如何保證百億流量資料一致性(上)【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 目錄 一、前情提示 二、什麼是資料一致性? 三、一個數據計算鏈路的梳理 四、資料計算鏈路的bug 五、電商庫存資料的不一致問題 六、大型系統的資料不一致排查有多困難 七、下篇預告 一、前情提示

億級流量系統架構之如何保證百億流量資料一致性(中)?【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 目錄 一、多系統訂閱資料回顧 二、核心資料的監控系統 三、電商庫存資料如何監控 四、資料計算鏈路追蹤 五、百億流量下的資料鏈路追蹤 六、自動化資料鏈路分析 七、下篇預告

億級流量系統架構之如何保證百億流量資料一致性)?【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 目錄 一、前情提示 二、選擇性訂閱部分核心資料 三、RabbitMQ的queue與exchange的繫結回顧 四、direct exchange實現訊息路由 五、按需訂閱數的程式碼實現 六、更加強

MySQL 在高併發的 訂單撮合 系統使用 共享鎖 與 排他鎖 保證資料一致性

作者:林冠巨集 / 指尖下的幽靈 掘金:juejin.im/user/587f0d… 部落格:www.cnblogs.com/linguanh/ GitHub : github.com/af913337456… 騰訊雲專欄: cloud.tencent.c

微服務架構 (九): 分散式微服務資料一致性

2016.8.21, 深圳, Ken Fang 微服務都擁有各自的資料庫且微服務都是部署在一分散式的環境下的。所以, 微服務間要維持彼此間資料庫中的資料的一致性, 便需採用: BASE – Basic Availability, Soft State, Eventual

敏捷開發, 由 User Story 中設計: 保證資料一致性的資料庫表結構

過往的資料庫設計思維∵強調整體,主要是期望藉由所謂的整體,使的資料庫設計可保證資料的 Integrity。 但這樣的思維,在面向物件的世界裡,往往因類設計時,類責任的不明確,而因為物件的存取破壞了資料

微服務架構資料一致性:可靠事件模式

在《微服務架構下的資料一致性:概念及相關模式》中介紹了在微服務中實現資料一致性的三種方式,包括可靠事件模式、業務補償模式、TCC模式。本文重點說一下可靠事件投遞。1. 可靠事件模式可靠事件模式屬於事件驅動架構,微服務完成操作後向訊息代理髮布事件,關聯的微服務從訊息代理訂閱到該

微服務架構資料一致性:概念及相關模式

從2014年開始,微服務逐漸進入大家的實現,被認為是下一代實現資訊化的有效手段。設計到系統,其中繞不開的就是資料一致性,從本地事務,到後來的分散式事務,都能夠有效的保證資料一致性。但是在微服務架構中,這兩種方式都不是最好的選擇。1. 使用本地事務和分散式事務保證一致性在傳統的

不同微服務獨立資料庫,如何保障微服務架構資料一致性

雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麼上來就是很有借鑑意義的乾貨,要麼就是以高階的專業術語來講述何為微服務架構。就是沒有一個做到成熟地將技

MySQL在高併發的訂單撮合、系統使用、共享鎖與排他鎖保證資料一致性

前序 距離上次擇文發表,兩月餘久。2018年也即將要結束了,目前的工作依然是與區塊鏈應用相關的,也很榮幸在9月初受邀簽約出版暫

海量資料架構如何保證Mycat的高可用?

## 寫在前面 > 在《[冰河,能講講Mycat如何實現MySQL的讀寫分離嗎?](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247490191&idx=1&sn=641966023ac4e950ace429b

【58沈劍架構系列】緩存與數據庫一致性保證

業務 b- ets 所有 緩存 post 一個 問題 ket 本文主要討論這麽幾個問題: (1)啥時候數據庫和緩存中的數據會不一致 (2)不一致優化思路 (3)如何保證數據庫與緩存的一致性 一、需求緣起 上一篇《緩存架構設計細節二三事》(點擊查看)引起了廣泛

從 0 開始的微服務架構:(四)如何保障微服務架構的數據一致性

網上 行數 解決方案 open 了解 傳播 發的 目的 cati 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就是很有借鑒意義的幹貨,要麽就是以