在微服務架構中的資料一致性

碼農談IT發表於2023-11-23

來源:小技術君

當從傳統的單體應用架構轉移到微服務架構時,特別是涉及資料一致性時,資料一致性是微服務架構中最困難的部分。傳統的單體應用中,一個共享的關係型資料庫負責處理資料一致性。在微服務架構中,如果使用“每個服務一個資料庫”的模式,那麼每個微服務都有自己的資料儲存。因此,資料庫在應用程式之間是分散式的。如果每個應用程式使用不同的技術來管理它們的資料,比如非關係型資料庫,這種分散式架構雖然在資料管理方面有許多好處,比如可伸縮性、高可用性、靈活性等,但在資料管理方面也存在一些關鍵問題,比如事務管理、資料一致性/完整性等方面。

在微服務架構中的資料一致性

問題:分散式系統中的資料一致性

對於單體應用程式,透過ACID事務,一個共享的關係型資料庫處理並保證資料的一致性。ACID 是一個縮寫,具體含義如下:

A 原子性:事務的所有步驟要麼全部成功,要麼全部失敗,沒有部分狀態,全有或全無。C 一致性:事務結束時資料庫中的所有資料都是一致的。I 隔離性:同一時間只有一個事務可以訪問資料,其他事務必須等待當前事務完成。D 永續性:資料在事務結束時被持久化到資料庫中。

為了保持強資料一致性,關係型資料庫管理系統支援ACID特性。

在微服務架構中的資料一致性

但在微服務架構中,每個微服務都有自己的資料儲存,並採用不同的技術。因此,沒有中央資料庫,也沒有單一的工作單元。業務邏輯被跨越到多個本地事務中。這意味著你不能在微服務架構中的資料庫之間使用單一的事務工作單元。但你仍然需要在你的應用程式中使用ACID特性。

在微服務架構中的資料一致性

讓我們用一個簡單的樣例場景來解釋。在一個訂單管理系統中,可能存在庫存管理、支付和訂單管理等服務。假設這些服務都按照微服務架構設計,並應用了“每個服務一個資料庫”的模式。為了完成訂單流程,訂單服務首先呼叫庫存管理服務進行庫存控制和預留,訂單中的相關產品被預留,以防止賣給其他客戶。第二步是支付步驟。支付服務負責支付業務。訂單服務呼叫支付服務,從客戶的信用卡中完成支付。由於每個服務都是獨立的,對分離的資料庫的更新在服務範圍內被提交。最後一步是建立訂單記錄。在這一步中,假設發生了技術錯誤,訂單記錄無法建立,訂單號無法傳送給客戶,但已從客戶那裡收到了付款。這裡出現了資料一致性問題。接下來我會在文章的“可能的解決方案”部分討論在這一點之後可以做些什麼。

在微服務架構中的資料一致性

可能的解決方案

首先,沒有一種單一的解決方案適用於所有情況。根據具體情況,可以採用不同的解決方案。

解決問題有兩種主要方法:

分散式事務最終一致性

分散式事務

在分散式事務中,事務在兩個或多個資源上執行(例如資料庫、訊息佇列)。透過分散式事務管理器或協調器,跨多個資料庫保證資料的完整性。

分散式事務是一個非常複雜的過程,因為涉及多個資源。

兩階段提交(2PC) 是一種阻塞協議,用於保證在分散式事務中所有事務要麼全部成功,要麼全部失敗。

XA標準 是2PC分散式事務的規範。JTA包括Xtandard API。符合JTA標準的應用伺服器支援Xtandard API。但所有資源必須部署到單個JTA平臺才能執行2PC。對於微服務架構來說,這不太合適。

分散式事務的優點

強的資料一致性支援ACID特性

分散式事務的缺點

維護起來非常複雜由於是阻塞過程(不適合高負載場景),高延遲和低吞吐量事務之間可能出現死鎖事務協調器是一個單點故障

最終一致性

最終一致性是分散式系統中用於實現高可用性

的模型。在一個最終一致性的系統中,允許一段時間的不一致,直到解決分散式資料的問題。

這個模型不適用於跨多個微服務的分散式ACID事務。最終一致性使用BASE資料庫模型。

雖然ACID模型提供了一個一致的系統,但BASE模型提供了高可用性。

BASE這個縮寫代表:

Basically Available:透過在資料庫叢集的節點之間複製資料來確保資料的可用性Soft-state:由於缺乏強一致性,資料可能隨時間變化。一致性責任委託給開發人員。Eventual consistency:BASE不可能立即提供一致性,但最終會提供一致性(在短時間內)。

SAGA 是一種操作最終一致性模型的常見模式。

基於協同的SAGA:在這種情況下,不存在中央協調器。每個服務在其任務完成後產生一個事件,並且每個服務監聽事件以採取行動。這種模式需要一個成熟的事件驅動架構。事件溯源:使用事件儲存來儲存事件變化狀態的方法。事件儲存是充當事件資料庫的訊息代理。透過重新播放來自事件儲存的事件來重建狀態。基於協同的SAGA模式在事務中步驟較少時可以很好地工作(例如2到4個步驟)。當事務中的步驟數量增加時,很難跟蹤哪些服務監聽哪些事件。基於編排的SAGA:協調器服務(Saga執行編排器,SEG)負責根據業務邏輯對事務進行排序。編排器決定應執行哪些操作。如果某個操作失敗,編排器會撤銷先前的步驟。這稱為補償操作。補償是在系統保持一致狀態時發生故障時要執行的操作。當資料已被不同的事務更改時,撤銷更改可能已經不可能。補償必須是冪等的,因為在重試機制中可能會被呼叫多次。必須小心設計補償。

有一些可用的框架可以實現Saga編排模式,例如Camunda、Apache Camel。

SAGA的優點

在本地原子事務中執行非阻塞操作事務之間沒有死鎖沒有單點故障

SAGA的缺點

最終的資料一致性沒有讀隔離,需要額外的努力(例如,使用者可能會看到操作已完成,但在幾秒鐘後由於補償事務被取消)當參與服務數量增加時,除錯困難開發成本增加(需要實際服務開發以及補償服務開發)設計複雜

在維護分散式資料儲存之間的資料一致性可能非常困難。在設計新應用程式時需要有不同的思維方式。我們可以說,資料一致性的責任從資料庫轉移到了應用程式級別。

選擇哪種解決方案

解決方案取決於使用案例和一致性要求。總的來說,應考慮以下設計考慮因素。

1.儘可能避免在微服務之間使用分散式事務。使用分散式事務會帶來更復雜的問題。2.設計你的系統,儘可能不要求分散式一致性。為了實現這一點,識別事務邊界;識別必須在同一工作單元中工作的操作。對於這種型別的操作使用強一致性識別可以容忍一致性方面的可能延遲的操作。對於這種型別的操作使用最終一致性3.考慮使用事件驅動架構進行非同步非阻塞服務呼叫4.透過補償和協調過程設計容錯系統,以保持系統的一致性5.最終一致性模式需要在設計和開發方面進行思維方式的轉變

結論

微服務架構具有諸如高可用性、可伸縮性、自動化、自治團隊等很多優點。為了最大程度地發揮微服務架構風格的效率,傳統方法需要進行一些改變。資料和一致性管理是需要仔細設計的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2996692/,如需轉載,請註明出處,否則將追究法律責任。

相關文章