JAVA微服務分散式事務的幾種實現方式

来源:https://www.cnblogs.com/ncyy/archive/2023/07/05/17529022.html
-Advertisement-
Play Games

# 基礎理論 ## CAP理論 一致性(Consistency) :在分散式系統中所有的數據備份,在同一時刻都保持一致狀態,如無法保證狀態一致,直接返回錯誤; 可用性(Availability):在集群中一部分節點故障,也能保證客戶端訪問系統並得到正確響應,允許一定時間內數據狀態不一致; 分區容錯性 ...


基礎理論

CAP理論

一致性(Consistency) :在分散式系統中所有的數據備份,在同一時刻都保持一致狀態,如無法保證狀態一致,直接返回錯誤;
可用性(Availability):在集群中一部分節點故障,也能保證客戶端訪問系統並得到正確響應,允許一定時間內數據狀態不一致;
分區容錯性(Partition tolerance):分散式系統在遇到任何網路分區故障時,仍然能保證對外提供滿足一致性和可用性的服務,除非整個網路環境都發生故障;

本地事務四大特性(ACID)

事務應該是具備原子性一致性隔離性和持久性,簡稱 ACID。
原子性(Atomicity) ,可以理解為一個事務內的所有操作要麼都執行,要麼都不執行。
**一致性(Consistency) **,可以理解為數據是滿足完整性約束的,也就是不會存在中間狀態的數據,事務前後數據的完整性必須保持一致。。
隔離性(Isolation) ,指的是多個事務併發執行的時候不會互相干擾,即一個事務內部的數據對於其他事務來說是隔離的。
持久性(Durability) ,指的是一個事務完成了之後數據就被永遠保存下來,之後的其他操作或故障都不會對事務的結果產生影響。

BASE理論

基本可用(Basically Available):分散式系統在出現故障時,保證核心可用,允許損失部分可用性。(響應時間上的損失、功能上的損失)
軟狀態(Soft State):系統中的數據允許存在中間狀態,中間狀態不影響系統的整體可用性。(支付中、處理中等)
最終一致性(Eventually Consistent):系統中的數據不可一直處於軟狀態,必須在有時間期限,在期限過後應當保證數據的一致性。(支付中變為支付成功)
相比於本地事務的ADIC強一致性模型,BASE理論提出通過犧牲一定的強一致性來獲得可用性;
不同業務單元和業務組件對數據一致性的要求不一樣,因此分散式系統中BASE理論和ACID特性會結合使用。

冪等性設計

冪等(Idempotent)是一個數學與電腦學中的概念。f(n) = 1^n , 無論n等於多少,f(n)永遠值等於1;
在程式中,使用相同參數執行同一個方法,每一次執行結果都是相同的,即具有冪等性;
以訂單狀態處理為例的冪等性設計,不論執行多少次orderProcess()方法,都只會扣減一次庫存,並且返回true。

分散式事務分類

二段提交2PC(Two-Phase-Commit)|三段提交3PC (Three-Phase-Commit)


三階段提交引入兩個機制
1、 引入超時機制。同時在協調者和參與者中都引入超時機制。
2、在第一階段和第二階段中插入一個準備階段。保證了在最後提交階段之前各參與節點的狀態是一致的。
主要解決的問題:
避免了參與者在長時間無法與協調者節點通訊(協調者掛掉了)的情況下,無法釋放資源的問題,因為參與者自身擁有超時機制會在超時後,自動進行本地commit從而進行釋放資源。而這種機制也側面降低了整個事務的阻塞時間和範圍。
缺點:
性能較差,會存在長時間的鎖表。

補償事務-TCC(Try-Confirm-Cancel)|Saga


TCC 與Saga其實就是採用的補償機制,其核心思想是:針對每個操作,都要註冊一個與其對應的確認和補償(撤銷)操作。確認和補償都有採用冪等性設計。

缺點:代碼量大,可維護性差。

消息事務


消息一致性方案是通過消息中間件保證上、下游應用數據操作的一致性。基本思路是將本地操作和發送消息放在一個事務中,保證本地操作和消息發送要麼兩者都成功或者都失敗。下游應用向消息系統訂閱該消息,收到消息後執行相應操作。
消息方案從本質上講是將分散式事務轉換為兩個本地事務,然後依靠下游業務的重試機制達到最終一致性。
代表產品:RocketMQ

海納百川有容乃大
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 遇到的問題 在一個新項目中,設計統一了項目中所有的字體,並提供了字體包。在項目中需要按需引入這些字體包。 首先,字體包的使用分為了以下幾種情況: 無特殊要求的語言使用字體A,阿拉伯語言使用字體B; 加粗、中等、常規、偏細四種樣式,AB兩種 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在使用 Vue 3 組件庫 Naive UI 的數據表格組件 DataTable 時碰到的問題,NaiveUI 的數據表格組件 DataTable 在固定頭部和列的示例中,在鍵盤操作下表格橫向滾動會有問題,本文是記錄下解決問題的過程 ...
  • 1、找到config.json,在配置文件中新增水印效果 /* 上傳圖片配置項 */ "imageWater": "true",/*******************新增圖片水印設置 這裡是新增*/ "imageActionName": "uploadsimage", /* 執行上傳圖片的acti ...
  • # jira安裝具體步驟 1. 安裝docker ![image](https://img2023.cnblogs.com/blog/2627104/202307/2627104-20230705230931019-1424539379.png) 2. 啟動docker ![image](https ...
  • Git是目前IT行業使用率最高的版本控制系統,相信大家在日常工作中也經常使用,每次Git提交都會包含提交信息,常用的包括說明、提交人和提交時間等,此篇文章主要向大家介紹下如何修改這些信息,這些命令在正常使用時可能不常用,但還是建議收藏以備不時之需。 ## 新提交 ### 指定提交信息 在使用`git ...
  • # Java 方法的重載、可變參數、作用域 # 1. 方法的重載 ## 使用相同的方法名來定義不同的方法,方法的重載能優化代碼,減少冗餘度。 ## 在使用方法的重載需要註意的地方有: > ## 1. 方法的重載需要方法名相同,並且形參類別、個數、順序不同(滿足其中之一) > > ## 2. 方法的重 ...
  • # Stream API > Stream API 是按照map/filter/reduce方法處理記憶體中數據的最佳工具。 > 本系列教程由Record講起,然後結合Optional,討論collector的設計。 ![](https://i.hongkj.cn/java17/logo-stream ...
  • # 為什麼需要IDE 在理解IDE之前,我們先做以下的實驗,新建一個文件,輸入以下代碼 ```python total_sum = 0 for x in range(1,101): total_sum += x print(total_sum) ``` 非常非常簡單的一個程式,主要就是計算1加到10 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...