07微服務的事務管理機制

一句話導讀

????????在單體應用程序中,事務通常是在單個數據庫或單個操作系統中管理的,而在微服務架構中,事務需要跨越多個服務和數據庫,這就使得事務管理變得更加復雜和困難。

目錄

一句話導讀

一、微服務事務管理的定義和意義

二、微服務事務管理的策略

????????1.使用Saga模式:

????????2.兩階段提交(2PC):

????????3.異步消息

????????4.分布式事務協調器

? ? ? ? 5.補償機制

三、分布式事務CAP原則

????????1.一致性(Consistency)

????????2.可用性(Availability)

????????3.分區容忍性(Partition Tolerance)

四、微服務事務管理的挑戰

????????1.原子性

????????2.一致性

????????3.隔離性

????????4.持久性


一、微服務事務管理的定義和意義

  • 定義:微服務事務管理是指在微服務架構中,對跨越多個服務的事務進行管理和協調。一個事務通常包含一系列的服務調用,這些服務調用要么全部成功,要么全部失敗。微服務事務管理的主要目標是確保跨多個服務的業務操作的一致性和可靠性。

圖(1)

????????上圖是一個經典的微服務事務管理示意圖,當客戶下單時,訂單服務聚合層接收到下單請求,將操作拆分成不同請求分發到不同服務中,如在訂單服務中創建訂單,在支付服務中創建支付訂單,在庫存服務中扣減庫存,這些操作要么都成功要么都失敗,這就是微服務的事務管理的基本特性。

  • 意義:在一個分布式系統中,事務管理變得尤為重要。由于不同的服務可能由不同的團隊開發和管理,因此必須有一種機制來確保跨多個服務操作的一致性和完整性。微服務事務管理提供了這樣的機制,使得開發者能夠更加專注于業務邏輯的實現,而不用擔心分布式事務的問題。

二、微服務事務管理的策略

????????目前,關于微服務事務管理的研究已經取得了許多成果。例如,二階段提交協議(2PC)、補償事務(Compensating Transactions)、Saga模式等都是解決分布式事務問題的常用方法。

????????1.使用Saga模式:

????????Saga是一種將大型事務拆分為一系列較小事務的模式。每個微服務都有自己的Saga,處理自己的事務,如果某個步驟失敗,可以觸發回滾或者補償操作。

????????Saga 模式的核心思想是,將長時間跨多個服務的大型事務拆分為多個小的本地事務,這些本地事務可以在系統中不同的節點上并行執行。每個本地事務都有一個對應的補償操作,用于撤銷該事務的影響。這種設計使得如果某個事務失敗,系統可以通過執行補償操作來回滾之前的操作,以保持數據的一致性。

圖(2)

相對應圖(1),圖(2)多了一個失敗回滾接口

????????2.兩階段提交(2PC):

????????2PC是一種協調多個事務參與者以確保所有參與者都同意提交或回滾的協議。盡管2PC具有一定的復雜性和性能開銷,但在某些情況下仍然是一個有效的解決方案。"2" 表示協議有兩個階段,而 "PC" 表示這兩個階段的操作

圖(3)

  • Coordinator(協調者):負責協調整個分布式事務的執行。協調者向所有參與者發送請求,以確定是否可以提交事務。
  • Participant(參與者):分布式系統中的各個節點,參與者執行實際的事務操作。參與者接收到協調者的請求,根據自身的狀態判斷是否可以提交事務。
  • CanCommit(階段1:準備階段Prepare):協調者向所有參與者發送請求,詢問是否可以提交事務。參與者根據自身狀態,判斷是否可以執行事務。
  • DoCommit(階段2:提交階段Commit):如果所有參與者都同意提交事務,協調者發送提交請求,參與者正式提交事務。

????????3.異步消息

????????使用消息隊列來實現異步通信,將事務操作轉化為消息,由接收方處理。這種方式可以減少分布式事務的復雜性。

????????4.分布式事務協調器

????????一些分布式事務協調器,如TCC(Try-Confirm-Cancel)和XA協議,可以用來處理分布式事務的協調和管理。

? ? ? ? 5.補償機制

????????在某些情況下,事務失敗后可以通過執行逆向操作來進行補償,確保數據的一致性

三、分布式事務CAP原則

????????CAP定理指的是在一個分布式系統中,一致性(Consistency)、可用性(Availability)和分區容忍性(Partition Tolerance)這三個屬性無法同時完全滿足,最多只能同時滿足其中的兩個。

圖(4)?

????????1.一致性(Consistency)

????????所有節點在同一時間具有相同的數據副本,即每個讀操作都能夠讀到最近一次的寫操作。

????????2.可用性(Availability)

????????每個非故障節點在合理的時間內都能夠響應請求,即系統隨時可用并能夠處理請求。

????????3.分區容忍性(Partition Tolerance)

????????即使網絡分區(節點之間的通信故障)發生,系統仍然能夠繼續運行,保持一致性和可用性。

四、微服務事務管理的挑戰

????????我們知道,在單體應用中事務的管理是基于關系型數據庫的事務機制實現的,因為單體應用只使用了一個數據庫,每個操作都是在該數據庫中進行。但是微服務卻不一樣,每個服務有自己的數據庫,跨服務、跨數據庫的事務管理就非常復雜了。單體應用的事務特性ACID對于微服務來說就是很大的挑戰

????????1.原子性

事務被視為一個不可分割的最小單位,多個操作組合形成一個事務,這些操作要么全部執行,要么全部不執行。

????????2.一致性

在分布式環境中,要確保多個微服務的操作要么全部成功,要么全部回滾,以維護數據的一致性。實現原子性和一致性需要精心的設計和實現。

????????3.隔離性

分布式事務需要處理并發操作,確保不同事務之間的操作不會相互干擾。保持隔離性是必要的,但也可能影響性能。

????????4.持久性

在微服務架構中,不同微服務的數據可能存儲在不同的數據庫中。確保分布式事務在各種故障情況下仍能保持持久性是一個挑戰。

除了以上ACID挑戰外還有如下:

  • 超時和重試:由于網絡延遲和故障,分布式事務可能會失敗。需要實現超時和重試機制,以確保事務能夠在一定時間內完成。
  • 分布式鎖:在分布式系統中,鎖是一種常用的同步機制。然而,如何實現一個可靠的分布式鎖是一個挑戰。
  • 性能問題:由于微服務事務涉及到多個服務的交互,因此可能會產生性能問題。如何優化微服務事務的性能也是一個重要的挑戰
  • 事務的回滾:當一個事務涉及到多個服務時,如果其中一個服務發生故障,如何回滾其他已經成功執行的服務也是一個挑戰。
  • 通信失敗:由于微服務之間采用分布式通信機制,因此可能會發生通信失敗的情況,導致事務無法正常進行。

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

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

相關文章

Layui列表表頭去掉復選框改為選擇

效果&#xff1a; 代碼&#xff1a; // 表頭復選框去掉改為選擇 $(".layui-table th[data-field"0"] .layui-table-cell").html("<span>選擇</span>");

做好以下幾點,可以讓我們延長周末體驗感,好好放松!!!

工作以后常常容易感到疲于奔命&#xff0c;讓我們找到適合自己方式&#xff0c;來讓我們度過一個充實放松的周末! 方向一&#xff1a;分享你周末的時間規劃 我們可以把每個月當做一個周期&#xff0c;制定一個簡單的計劃&#xff0c;如&#xff1a;第一周&#xff0c;鍛煉身體…

基于Prometheus監控Kubernetes集群

目錄 一、環境準備 1.1、主機初始化配置 1.2、部署docker環境 二、部署kubernetes集群 2.1、組件介紹 2.2、配置阿里云yum源 2.3、安裝kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安裝master節點 2.6、安裝node節點 2.7、安裝flannel、cni 2.8、部署測…

Go 1.21新增的內置函數(built-in functions)詳解

Go 1.21新增的內置函數分別是 min、max 和 clear&#xff0c;接下來看下這幾個函數的用途和使用示例。 在編程過程中&#xff0c;需要知道一組值中的最大或最小值的場景是很常見的&#xff0c;比如排序、統計等場景。之前都需要自己寫代碼來實現這個功能&#xff0c;現在 Go 1…

低成本無刷高速吹風機單片機方案

高速吹風機的轉速一般是普通吹風機的5倍左右。一般來說&#xff0c;吹風機的電機轉速一般為2-3萬轉/分鐘&#xff0c;而高速吹風機的電機轉速一般為10萬轉/分鐘左右。高轉速增加了高風速。一般來說&#xff0c;吹風機的風力只有12-17米/秒&#xff0c;而高速吹風機的風力可以達…

安卓獲取當前的IP地址

文章目錄 獲取IP地址完整示例代碼 獲取IP地址 在安卓中&#xff0c;我們使用靜態方法NetworkInterface.getNetworkInterfaces() 來獲取當前設備上所有的網絡接口。 網絡接口是指設備上用于進行網絡通信的硬件或軟件。這些接口可以是物理接口&#xff08;如以太網接口、無線網…

使用Docker搭建MySQL主從復制(一主一從)

Docker安裝MySQL docker pull mysql:5.7 docker images mysql安裝步驟 1.新建主服務器容器實例3307 docker run -p 3307:3306 --name mysql-master -v /usr/local/docker/mysql5.7/data/mysql-master/logs:/var/log/mysql -v /usr/local/docker/mysql5.7/data/mysql-master/…

Day 31 C++ STL常用算法(下)

文章目錄 常用拷貝和替換算法copy——容器內指定范圍的元素拷貝到另一容器中函數原型注意——利用copy算法在拷貝時&#xff0c;目標容器要提前開辟空間示例 replace——將容器內指定范圍的第一個舊元素修改為新元素函數原型注意——replace只會替換區間內滿足條件的第一個舊元…

cve-2016-7193:wwlib 模塊堆數據結構溢出

簡介 漏洞編號&#xff1a;cve-2016-7193漏洞類型&#xff1a;堆溢出軟件名稱&#xff1a;Office模塊名稱&#xff1a;wwlib歷史漏洞&#xff1a;較多影響的版本 攻擊利用&#xff1a;APT 攻擊利器-Word 漏洞 CVE-2016-7193 原理揭秘 操作環境 系統&#xff1a;Win10 1607軟…

C++ 動態內存

C 動態內存 C 程序中的內存分為兩個部分&#xff1a; 棧&#xff1a;在函數內部聲明的所有變量都將占用棧內存堆&#xff1a;這是程序中未使用的內存&#xff0c;在程序運行時可用于動態分配內存 很多時候&#xff0c;無法提前預知需要多少內存來存儲某個定義變量中的特定信…

【Docker報錯】docker拉取鏡像時報錯:no such host

報錯信息 [rootSoft soft]# docker pull mysql Using default tag: latest Error response from daemon: Head "https://registry-1.docker.io/v2/library/mysql/manifests/latest": dial tcp: lookup registry-1.docker.io on 192.168.80.2:53: no such host解決方法…

3D模型格式轉換工具如何與Parasolid集成?

概述 HOOPS Exchange包括一個 Parasolid 連接器&#xff0c;它允許 Parasolid 開發人員輕松地將 CAD 數據導入到活動的 Parasolid 會話中。如果源數據基于 Parasolid&#xff08;NX、Solid Edge 或 SolidWorks&#xff09;&#xff0c;則數據將按原樣導入。 這意味著您可以假…

主數據管理案例-某政務

1、 背景介紹及難點分析 近年來&#xff0c;我國在大數據發展方面持續發力&#xff0c;取得了明顯成效。但也要看到&#xff0c;目前我國大數據發展還存在“孤島化”“碎片化”等問題&#xff0c;無序參與過度與創新參與不足并存&#xff0c;導致大數據資源配置統籌不&#xff…

【C++】list容器

1.list基本概念 2.list構造函數 #include <iostream> using namespace std;#include<list> //鏈表list容器構造函數//輸出list鏈表 void printList(const list<int>& L) {for (list<int>::const_iterator it L.begin(); it ! L.end(); it){cout &…

STM32入門學習之定時器PWM輸出

1.脈沖寬度調制PWM(Pulse Width Modulation)是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。PWM可以理解為高低電平的占空比&#xff0c;即輸出高電平時間與低電平時間的比值。PWM的應用是否廣泛&#xff0c;比如在步進電機的控制中&#xff0c;可以通過P…

【MySQL系列】-回表、覆蓋索引真的懂嗎

【MySQL系列】-回表、覆蓋索引真的懂嗎 文章目錄 【MySQL系列】-回表、覆蓋索引真的懂嗎一、MYSQL索引結構1.1 索引的概念1.2 索引的特點1.3 索引的優點1.4 索引的缺點 二、B-Tree與BTree2.1 B-Tree2.2 BTree2.3 B-Tree 與BTree樹的區別2.4 那么為什么InnoDB的主鍵最好要搞成有…

記一次 .NET 某外貿ERP 內存暴漲分析

一&#xff1a;背景 1. 講故事 上周有位朋友找到我&#xff0c;說他的 API 被多次調用后出現了內存暴漲&#xff0c;讓我幫忙看下是怎么回事&#xff1f;看樣子是有些擔心&#xff0c;但也不是特別擔心&#xff0c;那既然找到我&#xff0c;就給他分析一下吧。 二&#xff1…

【軟件測試】接口測試工具APIpost

說實話&#xff0c;了解APIpost是因為&#xff0c;我的所有接口相關的文章下&#xff0c;都有該APIpost水軍的評論&#xff0c;無非就是APIpost是中文版的postman&#xff0c;有多么多么好用&#xff0c;雖然咱也還不是什么啥網紅&#xff0c;但是不知會一聲就亂在評論區打廣告…

【力扣每日一題】2023.8.14 合并二叉樹

目錄 題目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代碼&#xff1a; 題目&#xff1a; 示例&#xff1a; 分析&#xff1a; 給我們合并兩棵二叉樹&#xff0c;合并的方式就是把對應位置的節點的值相加&#xff0c;最后把合并后的二叉樹的根節點返回出去。 這類二…

You have docker-compose v1 installed, but we require Docker Compose v2.

curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose docker-compose --version