微服務架構下的分布式事務

系統軟件為了實現一定的業務,會將現實中的人、事、物進行抽象表示,并將其映射為系統中的模型。

業務模型大致可以按以下來構建:
1、定義系統中應該存在哪些實體、實體上有哪些屬性。
2、定義實體之間的各種拓撲關系,如從屬、嵌套、多對多。
3、定義實體和屬性的動態關系,即定義系統流程

第1、2步是靜態的,因此可以用E-R圖(實體-關系圖)來表示,它能夠描述系統在某個時間節點所有可能的狀態,第3步需要用流程圖和“狀態-轉移圖”來表示,它能夠描述系統隨著時間的推移的變化規律。

業務模型是系統中最容易發生變化的部分,體現在:
1、系統中的實體、屬性種類的增減
2、實體之間拓撲關系的改變
3、系統流程變更

數據庫是負責存儲這些業務模型的。數據存儲模型的設計就是數據庫的設計,工作包括:數據存儲結構、索引結構、讀寫控制。實體對應到表、實體的屬性對應到表中的字段,遵循數據庫設計范式減少冗余的表和字段。

單體應用時代通常采用單一的關系數據庫,微服務時代并不再受限于單一數據庫,微服務架構下,服務可以選擇專精于相應領域中的數據庫,如搜索引擎數據庫Elasticsearch,分布式存取海量數據的MongoDB等。

軟件系統為了保證業務模型上的狀態的互斥完備,就要求存儲模型也是互斥完備的。從數據庫角度來看,就是數據庫中某些表中的字段必須同時變化;從數據庫客戶端來看就是對數據庫進行一組寫入操作,要么成功,要么失敗。這就是所謂的事務。

事務的特點ACID:
1、A(Atomicity)原子性,在同一組數據庫操作中,其中某一步失敗了,之前的所有操作都會被回滾,不允許出現部分成功,部分失敗的情況。
2、C(Consistency)一致性,即數據操作符合某種業務約束。比如說A賬戶轉錢給B賬戶,那么對于兩個賬戶的錢的增減,應該符合A賬戶錢會減少,B賬戶應該增多。這就是一個比較簡單轉賬業務邏輯。符合相應的業務邏輯就達到了一致性要求。
3、I(Isolation)隔離性,并發的數據操作要有一定的隔離性,隔離性最差的情況是并發操作沒有一點隔離、互相干擾;最好的情況是并發操作等效于一系列串行操作。隔離性越高也意味著數據庫需要更多的資源來實現,存取數據的吞吐量也會隨之降低、延遲增加。
4、D(Durability)持久性,要求到達數據庫的數據不會丟失,換據話說就是存儲到了外存中,計算機停電、重啟等條件都不會導致數據丟失。

分布式系統的出現,尤其是分布式數據庫,相比較于單體應用和傳統的數據庫來說,除了要滿足ACID標準事務上,分布式系統還有一個問題尚未等到解決。就是常說的CAP三選二定理。

1、C(Consistency):一致性,就是說分布式系統的任何節點對同一個Key的讀寫請求的結果都是完全一致的。
2、A(Availability):可用性,就是每次請求都能夠得到及時并正常的響應,但是不保證數據是最新的。
3、P(Partition tolerance)分區容錯性,節點不能連通時,不能保持正常的運轉。

這三個特性不能同時滿足,只能滿足其中兩個。

有人是這么說的,因為P分區容錯性通常是無法避免的既定事實,如果不存在網絡分隔,又或者說不要求在出網絡隔離時,仍然要正常提供服務,那么對于這種情況完全可以放棄分布式架構,直接用集中心架構來做就可以。所以現在變成了,接受P,在C和A之間根據業務需要進行選擇。
1、選擇C一致性,放棄A可用性,就是要強一致性,低可用性。在這類系統中,寫入數據庫的請求只在提交并且同步到所有的數據庫節點后才會返回響應,任意一個節點出現故障都會導致服務整體不可用,直至故障修復。賬務金融領域的系統通常會采用這種架構。
2、選擇A可用性,放棄C一致性,就是要高可用,最終一致性。在這類系統中,寫入數據庫的請求只要在部分數據庫節點上成功提交即可立即返回響應,不需要等到數據同步到所有數據庫節點才返回。使用這樣的架構可以提供服務的可用率,只有要少數據存活的服務節點,服務就可用。壞處是寫入數據請求完成后的一段時間(無上限)內,讀取同一條數據的結果可能會有一定的概率是錯誤的,這種數據約束稱為BASE(Basically Available Soft state Eventually consistent)。
(1)基本可用:通過使用分布式數據庫,盡可能使用讀寫操作處于可用的狀態,但不保證數據的一致性,如數據可能沒有被持久化、或讀回的數據不是最新的。
(2)軟狀態:即某條數據在寫入后一段時間內的狀態是未知的,在最終收斂之前,系統有一定概率會返回最新的值。
(3)最終一致性:在系統功能正常的前提下,等待足夠長的時間之后,某條數據在系統中的狀態能夠收斂達成一致,之后,讀取到的數據都是最新的。

如果分布式系統如果采用了分布式甚至是異構的數據存儲方案,那么在寫順序方向可能會遇到問題: 同一條數據在不同服務上并發寫入時,可能會因為寫入順序不同而導致寫入的數據不一致。這種問題并不一定違反了BASE或ACID約束,但前業務模型的角度來看,這不是預期的結果,系統不能正確反映業務模型。比如說現在A、B、C三個服務各自使用了不同的數據庫,現在有兩個請求1和請求2,并發修改同一個數據項,這個數據項分別由這三個服務進行處理,由于網絡延遲,這個數據項在三個數據庫中的值可能會不一致,如在A中為100,在C中為200.

現在業界已有一些分布式事件框架方案:
1、XA標準和二階段提交協議
XA標準(eXtended Architecture 擴展后的架構)這個標準目的是嘗試提供一套分布式事務的處理的標準。它描述了全局的事務管理與局部的資源管理器之間的接口。通過這套接口,應用可以在同一事務中跨越多個服務訪問多個資源(如數據庫、隊列、服務)。這個標準使用了兩階段提交協議(two-phase commit,2PC)來保證所有資源同時提交或回滾任何特定的事務。

兩階段提交協議引入協調者角色,它負責統一掌握所有數據存儲節點(參與者)的操作結果:
第一階段:參與者并發進行數據操作,將結果是否成功通知協調者;
第二階段:協調者根據所有參與者的反饋,決定是確認提交還是中止操作,并將這個決定告知所有參與者。

XA標準和二階段提交協議的好處是:強一致性,實現數據在多個數據庫上的ACID約束;業務侵入性也小,完全依賴各個數據庫本身劫持實現分布式事務,不需要修改業務邏輯。壞處是:數據庫的選型受限,只能選擇支持XA標準的數據庫;其次就是單點故障降低可用性,所有節點都不能出錯;支持XA標準的數據庫在設計上有大量的阻塞和資源占位,數據體量和吞吐量擴展性差。

總結來說XA標準和二階段提交協議是強一致性,低可用性的方案,正好是金融行業常用的架構。

2、Saga分布式事務框架
它的思路是借助驅動流程機制,按順序執行每個數據操作步驟。一旦出錯,就倒序執行之前各步驟對應的“補償”操作。所以Saga要求每個步驟涉及的服務都要提供正向操作接口和對應的補償操作接口。
Saga框架通過對一些基礎服務進行組合/編排來完成各種業務需求,比較靈活,對數據庫也沒有什么特別的要求,甚至不要數據庫。它只滿足了ACID中的A和C。需要服務實現數據補償的操作,這工作會增加開發和維護的成本。

Saga目前有Saga Orchestration 和Choreography兩種實現。

3、ACID事務鏈的分布式事務框架

ACID事務鏈要求參與分布式事務的所有服務都要使用支持ACID事務的數據庫,在每個服務內部,都將數據操作和同步調用相鄰服務的操作打包到一個ACID事件中,通過ACID事務的鏈式調用來實現分布式事務。它的優點相當明顯就是支持ACID。回滾的操作由支持ACID數據庫執行。缺點也明顯數據庫選型受限,服務耦合過多,服務之間的依賴是鏈式拓撲,非常不方便調整,如果出現服務之間的循環依賴,會出現很多麻煩。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210255.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210255.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210255.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023五岳杯量子計算挑戰賽數學建模思路+模型+代碼+論文

賽題思路:12月6日晚開賽后第一時間更新,獲取見文末名片 “五岳杯”量子計算挑戰賽,是國內專業的量子計算大賽,也是玻色量子首次聯合移動云、南方科技大學共同發起的一場“企校聯名”的國際競賽,旨在深度融合“量子計算…

Python處理Excel文件并與數據庫匹配做拼接

Python處理Excel文件并與數據庫匹配做拼接 需求:Python處理Excel中數據并于數據庫交互匹配得到賬號信息等其他操作 Python實現 import os import pandas as pd import pymssql import warnings import time# 提取速率函數 def extract_broadband_speed(speed):if…

【外觀模式】SpringBoot集成mail發送郵件

前言 發送郵件功能,借鑒 剛果商城,根據文檔及項目代碼實現。整理總結便有了此文,文章有不對的點,請聯系博主指出,請多多點贊收藏,您的支持是我最大的動力~ 發送郵件功能主要借助 mail、freemarker以及rocke…

Java 泛型相關知識

什么是泛型? Java 泛型(generics)是JDK5中引入的一種參數化類型特性。 為什么使用泛型,使用泛型的好處? 代碼更健壯(只要編譯期沒有警告,那么運行期就不會出現 ClassCastException)代碼更簡潔(不用強轉)代碼更靈活,復用什么是參數化類型: 把類型當參數一樣傳遞<…

C語言絕對值得一看的常識講解:柔性數組補充篇

今天突然看到一個比較特別的知識點——柔性數組。它是在C99中出現的一種特別的數組&#xff0c;具體是指結構體中的最后一個元素允許是未知大小的數組&#xff0c;這就叫做『柔性數組』成員。 目錄 1.柔性數組的定義 2.柔性數組的特點 3.柔性數組的使用舉例 4.柔性數組的優…

React基礎語法整理

安裝&#xff1a; yarn create react-app reatc-lesson --template typescript yarn create 創建一個react-app的應用 項目名稱 typescript 的模板react-app 官方地址 https://create-react-app.bootcss.com/docs/adding-typescriptreact 語法文檔 https://zh-hans.react.dev…

Vue筆記(一)基礎

VUE 官方文檔&#xff1a;https://cn.vuejs.org/ 創建VUE項目 前提&#xff1a;已安裝 16.0 或更高版本的 Node.js 進入要創建的目錄&#xff0c;執行命令&#xff1a;npm create vuelatest 安裝依賴&#xff0c;啟動&#xff1a; //進入項目目錄&#xff0c;運行命令安裝依賴…

基于Vue框架的電子商城購物平臺小程序的設計與開發

基于JavaWebSSMVue電子商城購物平臺小程序系統的設計和實現 源碼獲取入口KaiTi 報告/Ren務書Lun文目錄前言主要技術系統設計功能截圖訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 KaiTi 報告/Ren務書 一、選題的目的和意義 自從微信推出了微信小程序…

使用命令行移除VSAN中故障磁盤

原創作者&#xff1a;運維工程師 謝晉 使用命令行移除VSAN中故障磁盤 前提故障盤移除 前提 客戶有套VSAN環境內有一臺服務器的磁盤組出現了一塊故障的數據盤&#xff0c;但該盤已經處于完全掉線狀態&#xff0c;無法進行正常移除。如下圖&#xff1a; 如果遇到這種情況&am…

P9 LinuxC 進程概述 終端啟動的程序父進程是終端

前言 &#x1f3ac; 個人主頁&#xff1a;ChenPi &#x1f43b;推薦專欄1: 《C_ChenPi的博客-CSDN博客》??? &#x1f525; 推薦專欄2: 《Linux C應用編程&#xff08;概念類&#xff09;_ChenPi的博客-CSDN博客》??? &#x1f6f8;推薦專欄3: ??????《鏈表_ChenP…

【1】一文讀懂PyQt簡介和環境搭建

目錄 1. PyQt簡介 1.1. Qt 1.2. PyQt 1.3. 關于PyQt和PySide 2. 通過pip安裝PyQt5 3. 無法運行處理 4. VSCode配置PYQT插件 PyQt官網:Riverbank Computing | Introduction 1. PyQt簡介 PyQt是一套Python的GUI開發框架,即圖形用戶界面開發框架。 Python中經常使用的GU…

FreeRTOS的內存管理方法(超詳細)

內存管理 我們知道每次創建任務、隊列、互斥鎖、軟件定時器、信號量或事件組時&#xff0c;RTOS 內核都需要 RAM &#xff0c; RAM 可以從 RTOS API 對象創建函數內的 RTOS 堆自動動態分配&#xff0c; 或者由應用程序編寫者提供。 如果 RTOS 對象是動態創建的&#xff0c;那么…

Leetcode—2646.最小化旅行的價格總和【困難】

2023每日刷題&#xff08;五十三&#xff09; Leetcode—2646.最小化旅行的價格總和 算法思想 看靈神的 實現代碼 class Solution { public:int minimumTotalPrice(int n, vector<vector<int>>& edges, vector<int>& price, vector<vector&l…

發現數學之美--微積分的起源和用途(一文搞懂微積分)

數學&#xff0c;改變世界的基石。微積分十九世紀的三大自然發現之一&#xff0c;迪卡爾建立了解析幾何&#xff0c;把數與圖結合在一起&#xff0c;微積分的發現與創立&#xff0c;是數學新的里程碑&#xff0c;解決了常規方法無法解決的問題&#xff0c;是一次偉大的革命。迪…

服務器數據損壞了有辦法修復嗎 ?

對于企業網站來說&#xff0c;數據庫往往是服務器中最核心的部分&#xff0c;所以一旦數據庫發生損壞&#xff0c;將會給企業帶來巨大的損失&#xff0c;因 此數據庫的數據恢復功能變得越來越重要了。在服務器運行過程中&#xff0c;由于斷電、操作不當或者是客觀原因損壞到服務…

git安裝和配置

git安裝和配置 一、軟件介紹 Git是一個免費開源的分布式版本控制系統&#xff0c;旨在快速高效地處理從小型到大型項目的所有內容。 Git易于學習&#xff0c;占地面積小&#xff0c;性能閃電般快。它以廉價的本地分支、方便的暫存區域和多個工作流等功能勝過了Subversion、C…

linux 常用指令目錄大綱

Linux下的Signal信號處理及詳解&#xff0c;test ok-CSDN博客 Linux下怎樣判斷一個binary是否可以debug//test ok_感知算法工程師的博客-CSDN博客 linux file命令的用法//test ok-CSDN博客 linux下生成core dump方法與gdb解析core dump文件//test ok-CSDN博客 linux readel…

【論文閱讀】Reachability and distance queries via 2-hop labels

Cohen E, Halperin E, Kaplan H, et al. Reachability and distance queries via 2-hop labels[J]. SIAM Journal on Computing, 2003, 32(5): 1338-1355. Abstract 圖中的可達性和距離查詢是許多應用的基礎&#xff0c;從地理導航系統到互聯網路由。其中一些應用程序涉及到巨…

第7節:Vue3 動態綁定多個屬性

可以使用v-bind指令將多個屬性動態綁定到元素上。以下是一個簡單的實例&#xff1a; <template><view class"container"><text v-bind"dynamicProps">{{ message }}</text><button click"toggleActive">切換激活…

金南瓜SECS/GEM C# SDK 快速使用指南

本文對如何使用金南瓜SECS/GEM C# SDK 快速創建一個滿足SECS/GEM通信要求的應用程序&#xff0c;只需簡單3步完成。 第一步&#xff1a;創建C# .NET程序 示例使用Visual Studio 2010&#xff0c;使用者可以選擇更高級版本 Visual Studio 第二步&#xff1a;添加DLL庫引用&am…