Seata分散式事務 (理論與部署相結合)

来源:https://www.cnblogs.com/buchizicai/archive/2023/02/14/17093759.html
-Advertisement-
Play Games

Seata是SpringCloud Alibaba開發出的一款開源的分散式事務解決方案,致力於提供高性能和簡單易用的分散式事務服務。Seata 將為用戶提供了 AT 、TCC 、SAGA 和 XA 事務模式,為用戶打造一站式的分散式解決方案。可以很好的解決分散式系統中事務的問題。Seata的主要特點... ...


分散式事務——Seata

分散式事務

1. 本地事務與分散式事務

1.1 本地事務

本地事務,也就是傳統的單機事務。在傳統資料庫事務中,必須要滿足四個原則:

image

1.2 分散式事務問題

分散式事務,就是指不是在單個服務或單個資料庫架構下,產生的事務,例如:

  • 跨數據源的分散式事務
  • 跨服務的分散式事務
  • 綜合情況

在資料庫水平拆分、服務垂直拆分之後,一個業務操作通常要跨多個資料庫、服務才能完成。例如電商行業中比較常見的下單付款案例,包括下麵幾個行為:

  • 創建新訂單
  • 扣減商品庫存
  • 從用戶賬戶餘額扣除金額

完成上面的操作需要訪問三個不同的微服務和三個不同的資料庫。

image

訂單的創建、庫存的扣減、賬戶扣款在每一個服務和資料庫內是一個本地事務,可以保證ACID原則。

但是當我們把三件事情看做一個"業務",要滿足保證“業務”的原子性,要麼所有操作全部成功,要麼全部失敗,不允許出現部分成功部分失敗的現象,這就是分散式系統下的事務了。

此時ACID難以滿足,這是分散式事務要解決的問題

2. 分散式事務解決理論

解決分散式事務問題,需要一些分散式系統的基礎知識作為理論指導。

2.1.CAP定理

CAP定理是說在P一定會出現的情況下,A和C之間只能實現一個

1998年,加州大學的電腦科學家 Eric Brewer 提出,分散式系統有三個指標。

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance (分區容錯性)

image

它們的第一個字母分別是 C、A、P。

Eric Brewer 說,這三個指標不可能同時做到。這個結論就叫做 CAP 定理。

2.1.1. C:一致性

Consistency(一致性):用戶訪問分散式系統中的任意節點,得到的數據必須一致。

比如現在包含兩個節點,其中的初始數據是一致的;當我們修改其中一個節點的數據時,兩者的數據產生了差異;要想保住一致性,就必須實現node01 到 node02的數據 同步:

image

2.1.2. A:可用性

Availability (可用性):用戶訪問集群中的任意健康節點,必須能得到響應,而不是超時或拒絕。

如圖,有三個節點的集群,訪問任何一個都可以及時得到響應:

image

當有部分節點因為網路故障或其它原因無法訪問時,代表節點不可用:

image

2.1.3. P:分區容錯

Partition(分區):因為網路故障或其它原因導致分散式系統中的部分節點與其它節點失去連接,形成獨立分區。

image

Tolerance(容錯):在集群出現分區時,整個系統也要持續對外提供服務

2.1.4. 矛盾

在分散式系統中,系統間的網路不能100%保證健康,一定會有故障的時候,而服務有必須對外保證服務。因此Partition Tolerance不可避免。

當節點接收到新的數據變更時,就會出現問題了:

image

如果此時要保證一致性,就必須等待網路恢復,完成數據同步後,整個集群才對外提供服務,服務處於阻塞狀態,不可用。

如果此時要保證可用性,就不能等待網路恢復,那node01、node02與node03之間就會出現數據不一致。

也就是說,在P一定會出現的情況下,A和C之間只能實現一個。

2.2.BASE理論

BASE理論是對CAP的一種解決思路,包含三個思想:

  • Basically Available (基本可用):分散式系統在出現故障時,允許損失部分可用性,即保證核心可用。
  • Soft State(軟狀態):在一定時間內,允許出現中間狀態,比如臨時的不一致狀態。
  • Eventually Consistent(最終一致性):雖然無法保證強一致性,但是在軟狀態結束後,最終達到數據一致。

2.3.解決分散式事務的思路

分散式事務最大的問題是各個子事務的一致性問題,因此可以借鑒CAP定理和BASE理論,有兩種解決思路:

  • AP模式:各子事務分別執行和提交,允許出現結果不一致,然後採用彌補措施恢複數據即可,實現最終一致。

  • CP模式:各個子事務執行後互相等待,同時提交,同時回滾,達成強一致。但事務等待過程中,處於弱可用狀態。

小知識:ES就是使用了AP模式。當有節點宕機時就會斷開此節點,並將之前在此節點備份好的數據錄入其他節點

但不管是哪一種模式,都需要在子系統事務之間互相通訊,協調事務狀態,也就是需要一個事務協調者(TC)

image

這裡的子系統事務,稱為分支事務;有關聯的各個分支事務在一起稱為全局事務

Seata

Seata是 2019 年 1 月份螞蟻金服和阿裡巴巴共同開源的分散式事務解決方案。致力於提供高性能和簡單易用的分散式事務服務,為用戶打造一站式的分散式解決方案。

官網地址:http://seata.io/,其中的文檔、播客中提供了大量的使用說明、源碼分析。

image

1. Seata的架構

Seata事務管理中有三個重要的角色:

  • TC (Transaction Coordinator) - 事務協調者:維護全局和分支事務的狀態,協調全局事務提交或回滾。

  • TM (Transaction Manager) - 事務管理器:定義全局事務的範圍、開始全局事務、提交或回滾全局事務。

  • RM (Resource Manager) - 資源管理器:管理分支事務處理的資源,與TC交談以註冊分支事務和報告分支事務的狀態,並驅動分支事務提交或回滾。

整體的架構如圖:

image

Seata基於上述架構提供了四種不同的分散式事務解決方案:

  • XA模式:強一致性分階段事務模式,犧牲了一定的可用性,無業務侵入
  • AT模式:最終一致的分階段事務模式,無業務侵入,也是Seata的預設模式
  • TCC模式:最終一致的分階段事務模式,有業務侵入
  • SAGA模式:長事務模式,有業務侵入

無論哪種方案,都離不開TC,也就是事務的協調者。

2. 部署TC服務

就是把Seata註冊到nacos中

2.1 下載

首先我們要下載seata-server包,地址在http

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇文章繼續討論分散式架構中的調度演算法,為瞭解決單體調度面臨的問題,我們引入兩層調度。我們會討論兩層調度的工作原理,兩種使用了兩層調度的解決方案:Apache Mesos和Hadoop YARN。 ...
  • ~~(oh!多麼美好的一天)~~ 看題! 原題鏈接(洛谷) [CSP-J2020] 直播獲獎 題目描述 NOI2130 即將舉行。為了增加觀賞性,CCF 決定逐一評出每個選手的成績,並直播即時的獲獎分數線。本次競賽的獲獎率為 w%,即當前排名前 w% 的選手的最低成績就是即時的分數線。 更具體地,若 ...
  • 本文已收錄至Github,推薦閱讀 👉 Java隨想錄 微信公眾號:Java隨想錄 CSDN: 碼農BookSea 烈火試真金,逆境試強者。——塞內加 什麼是ThreadLocal 首先看下ThreadLocal的使用示例: public class ThreadLocalTest { priva ...
  • 教程簡介 轉換率優化定義 - 從定義,基礎知識,瞭解客戶,目標設置,誤區,優化計劃,用戶體驗和漏斗優化,目標網頁優化,降低退回和退出率,測試和優化,測量結果,學習轉換率優化優化技巧,結論。 教程目錄 轉換率優化 - 定義 轉換率優化 - 基礎知識 瞭解您的客戶 轉換率優化 - 目標設定 轉換率優化 ...
  • 前言 由於在2月13日,Autojs的作者發出公告將審查所有代碼,併在最新版刪除了無障礙截圖、通知監聽等功能,在打開所有版本都會提示強制更新,之前關註的公眾號都連夜刪除了教程文章,在搜索時,發現教程作者的文章在其它平臺還未刪除,為了保險起見,備份一下他的文章。由於他寫的文章很多,文章將通過爬蟲的方式 ...
  • 教程簡介 LINQ初學者教程 - 從簡單和簡單的步驟學習LINQ(語言集成查詢),從基本到高級概念,包括概述,環境設置,標準查詢運算符,LINQ to SQL,LINQ對象,LINQ到數據集,LINQ到XML, LINQ to Entities,LINQ Lambda表達式,LINQ with AS ...
  • 1.讓伺服器監聽客戶端的連接請求 1.1 代碼塊 #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include<stdio.h> #include<stdlib.h> #define BUFFER_LEN 1 ...
  • 大數處理方案 BigInteger 適合保存比較大的整數。 public class BigInteger_ { public static void main(String[] args) { //當我們編程中,需要處理很大的整數,long不夠用 //可以使用BigInteger的類來搞定 // ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...