Seata Saga模式實戰:Java微服務中的分布式事務管理

在分布式系統中,Saga模式是一種用于管理跨多個服務的事務的柔性事務解決方案。它通過將長事務拆分為多個本地事務(每個事務對應一個服務的操作),并通過補償機制保證最終一致性。以下是Java中Saga模式的詳細介紹,包括實現方式、代碼示例和適用場景。


1. Saga模式的核心概念

1.1 核心思想
  • 長事務拆解:將一個全局事務分解為多個本地事務,每個本地事務獨立執行并提交。
  • 補償機制:如果某個本地事務失敗,通過逆向操作(補償事務)撤銷之前的操作,確保數據最終一致性。
  • 最終一致性:不保證原子性(ACID),而是通過補償操作逐步恢復一致性。
1.2 核心要素
  • 事務序列:按順序執行的本地事務集合。
  • 補償事務:每個本地事務的逆向操作,用于失敗時回滾。
  • 協調器:負責監控事務狀態并觸發補償操作(可選)。
  • 狀態機:通過狀態轉移圖定義事務流程(如基于DSL的編排)。

2. Java中Saga模式的實現方式

2.1 手動實現

通過自定義類和接口管理事務步驟及補償邏輯。適合簡單場景或對框架依賴較少的項目。

代碼示例
// 定義事務步驟接口
interface TransactionStep {void execute() throws Exception;void compensate();
}// 實現具體事務步驟
class BookFlightStep implements TransactionStep {@Overridepublic void execute() throws Exception {System.out.println("Executing BookFlight");// 模擬失敗throw new Exception("Flight booking failed");}@Overridepublic void compensate() {System.out.println("Compensating CancelFlight");}
}// Saga協調器
class Saga {private List<TransactionStep> steps = new ArrayList<>();private int currentStep = 0;void addStep(TransactionStep step) {steps.add(step);}void execute() throws Exception {for (currentStep = 0; currentStep < steps.size(); currentStep++) {steps.get(currentStep).execute();}}void compensate() {for (int i = currentStep - 1; i >= 0; i--) {steps.get(i).compensate();}}
}// 使用示例
public class SagaPatternDemo {public static void main(String[] args) {Saga saga = new Saga();saga.addStep(new BookFlightStep());saga.addStep(new BookHotelStep());try {saga.execute();System.out.println("Saga completed successfully.");} catch (Exception e) {saga.compensate();System.out.println("Saga failed, compensating...");}}
}
關鍵點
  • 逆序補償:失敗時從當前步驟倒序執行補償操作。
  • 異常處理:捕獲異常并觸發補償邏輯。
  • 冪等性:確保補償操作可重入,避免重復執行。

2.2 使用框架實現

通過框架(如Axon Framework、Spring Cloud Saga)簡化實現,適合復雜業務場景。

2.2.1 Axon Framework

Axon Framework提供了Saga管理功能,通過事件驅動協調事務。
具體參考:Axon Framework實現電商Saga模式-CSDN博客

代碼示例
// 定義Saga
@Saga
public class OrderSaga {@StartSagapublic void handle(CreateOrderCommand command) {// 調用訂單服務創建訂單OrdersCreatedEvent event = new OrdersCreatedEvent(command.getOrderId());messageGateway.send(event);}@SagaEventHandlerpublic void on(InventoryDeductedEvent event) {// 調用庫存服務扣減庫存}@SagaEventHandlerpublic void on(PaymentFailedEvent event) {// 觸發補償:恢復庫存compensateInventory(event.getOrderId());}@EndSagapublic void handle(OrderCompletedEvent event) {// 事務完成}
}
關鍵點
  • 事件驅動:通過事件(Event)觸發后續事務步驟。
  • 注解支持:使用@Saga@StartSaga@EndSaga等注解定義Saga生命周期。
  • 狀態管理:框架自動管理Saga的狀態和補償邏輯。
2.2.2 Spring Cloud Saga

Spring Cloud Saga通過編排式或協調式實現事務管理。

代碼示例
// 定義Saga流程
@Bean
public SagaDefinition orderSaga() {return new SagaDefinitionBuilder().step("createOrder").invokeService("orderService", "createOrder").onSuccess().step("deductInventory").invokeService("inventoryService", "deductInventory").onSuccess().step("chargePayment").invokeService("paymentService", "chargePayment").build();
}
關鍵點
  • 編排式設計:通過配置文件或代碼定義事務步驟。
  • 服務調用:通過服務名調用具體業務邏輯。
  • 補償策略:框架自動處理失敗時的補償流程。

3. Saga模式的實現策略

3.1 協調式(Orchestration)
  • 集中式協調器:由一個服務(協調器)主動發起和管理事務步驟。
  • 優點:流程可控,適合強耦合業務。
  • 缺點:協調器可能成為單點故障。
3.2 協同式(Choreography)
  • 去中心化:每個服務通過事件/消息獨立響應,無需協調器。
  • 優點:松耦合,擴展性強。
  • 缺點:流程復雜,調試困難。

4. 優勢與挑戰

4.1 優勢
  • 低資源占用:無全局鎖,適合長流程。
  • 異步支持:通過消息隊列實現異步化。
  • 高擴展性:可集成任意資源類型。
4.2 挑戰
  • 補償邏輯復雜:需手動設計,可能存在遺漏。
  • 冪等性處理:需確保補償操作可重入。
  • 狀態維護成本:業務變更時需同步調整狀態機。

5. 適用場景

  • 電商場景:下單、扣庫存、支付等流程。
  • 金融場景:跨行轉賬、優惠券發放。
  • 物聯網:設備注冊、配置失敗后的重試。
不適用場景
  • 強一致性要求:如銀行實時轉賬。
  • 簡單原子操作:單個數據庫更新無需Saga。

6. 監控與測試

  • 監控:通過日志或APM工具跟蹤Saga狀態(如Axon的Event Store)。
  • 測試:端到端測試驗證補償邏輯,模擬失敗場景(如服務宕機)。

7. 總結

Saga模式是分布式系統中處理長事務的常用方案,尤其適合微服務架構。在Java中,可通過手動實現或框架(如Axon、Spring Cloud Saga)快速集成。選擇協調式或協同式策略需根據業務復雜度和耦合度決定。盡管補償邏輯設計復雜,但通過合理的設計和測試,可以有效保障系統的最終一致性。

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

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

相關文章

若依學習筆記1-validated

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 保證 Spring AOP 相關的依賴包 --><dependency><groupId>org.springframework.boot<…

Excel 如何處理更復雜的嵌套邏輯判斷?

處理復雜的嵌套邏輯判斷&#xff0c;是Excel進階路上必然會遇到的一道坎。當簡單的IF函數“套娃”變得冗長、難以閱讀和維護時&#xff0c;我們就需要更高級、更清晰的工具。 這里介紹三種從基礎到高級的處理方法&#xff1a; 傳統的 IF 函數嵌套 (經典&#xff0c;但容易混亂)…

使用Claude和MCP增強Selenium

1.配置MCP服務器打開Claude Desktop—>Settings—>Developer—>Edit Config{"mcpServers": {"selenium": {"command": "npx","args": ["-y", "angiejones/mcp-selenium"]}} }配置完成后重啟Cl…

數據倉庫錨點建模方法的前世今生

數據倉庫錨點建模方法&#xff08;Anchor Modeling&#xff09;作為一種面向復雜數據環境的創新方法論&#xff0c;其發展歷程與技術演進深刻反映了數據管理從結構化到動態化的轉型需求。以下從起源、發展、核心思想、技術演進及未來趨勢五個維度&#xff0c;系統梳理錨點建模的…

<三>Sping-AI alibaba 文生圖

環境和配置請看&#xff1c;二&#xff1e;Sping-AI alibaba 入門-記憶聊天及持久化 源代碼&#xff1a;https://github.com/springaialibaba/spring-ai-alibaba-examples/blob/main/spring-ai-alibaba-image-example/dashscope-image/src/main/java/com/alibaba/cloud/ai/exam…

vue組件和模板

好的&#xff0c;我們來詳細解釋一下在 Vue&#xff08;以及現代前端開發&#xff09;中兩個最核心的概念&#xff1a;組件 (Component) 和 模板 (Template)。 理解了它們&#xff0c;就等于掌握了現代 Web 應用開發的基石。 一個核心比喻&#xff1a;樂高積木 在開始前&…

python學習打卡:DAY 18 推斷聚類后簇的類型

浙大疏錦行 聚類后的分析&#xff1a;推斷簇的類型 知識點回顧&#xff1a; 推斷簇含義的2個思路&#xff1a;先選特征和后選特征通過可視化圖形借助ai定義簇的含義科研邏輯閉環:通過精度判斷特征工程價值 作業&#xff1a;參考示例代碼對心臟病數據集采取類似操作&#xff0c;…

Ubuntu for ARM 更換為阿里云鏡像源

1. 簡介 該鏡像適用于配置 ARM, PowerPC 等其他架構的 ubuntu系統&#xff0c;不適用 x86 &#xff01;&#xff01;&#xff01; 各種版本的Ubuntu for ARM下載地址&#xff1a;https://cdimage.ubuntu.com/releases 2. 配置方法 打開 sources.list 文件。 vim /etc/apt/s…

HTML與JavaScript:構建動態交互式Web頁面的基石

HTML與JavaScript&#xff1a;構建動態交互式Web頁面的基石 在現代Web開發中&#xff0c;HTML和JavaScript是不可或缺的兩位主角。HTML負責頁面的結構和內容&#xff0c;而JavaScript則賦予頁面生命&#xff0c;使其能夠響應用戶交互、動態更新內容&#xff0c;并與后端服務進…

Python數據分析基礎03:探索性數據分析

相關文章&#xff1a; 《python數據分析基礎02&#xff1a;數據可視化分析》 《Python數據分析基礎01&#xff1a;描述性統計分析》 探索性數據分析&#xff08;Exploratory Data Analysis, EDA&#xff09; 的深度解析&#xff0c;涵蓋核心目標、方法論框架、關鍵技術及可視…

D3 面試題100道之(41-60)

這里是D3的面試題,我們從第 41~60題 開始逐條解答。一共100道,陸續發布中。 ?? 面試題(第 41~60 題) 41. D3 中如何添加圖例? 圖例可以通過手動創建 SVG 元素或使用 D3 的輔助函數來實現。常見做法是結合 d3.scaleOrdinal() 和 .range() 創建顏色映射圖例。 示例: c…

Spring Boot事件驅動模型深度解析

目錄 一、什么是Spring事件機制&#xff1f; 與傳統方法調用的對比&#xff1a; 二、四大核心組件解析 1. ApplicationEvent&#xff1a;事件對象 2. ApplicationEventPublisher&#xff1a;事件發布器 3. ApplicationListener&#xff1a;事件監聽接口 4. EventListener…

Python gmssl.SM4使用案例

Python gmssl.SM4使用案例 摘要:在異構計算系統驗證中,通常會有數據加解密的要求,例如用戶數據、權重參數等,本文將詳細介紹在UVM驗證環境中,調用Python的gmssl庫,用SM4實現加解密的驗證方案。 一、Python gmssl 庫介紹 gmssl 是一個開源的、純Python實現的國密算…

迅為高情性6TOPS算力的RK3576開發板NPU rknn-model-zoo例程演示

迅為iTOP-3576開發板采用瑞芯微RK3576高性能、低功耗的應用處理芯片&#xff0c;集成了4個Cortex-A72和4個Cortex-A53核心&#xff0c;以及獨立的NEON協處理器。它適用于ARM PC、邊緣計算、個人移動互聯網設備及其他多媒體產品。支持INT4/INT8/INT16/FP16/BF16/TF32混合運算&am…

rsync 命令詳解

目錄 rsync 傳輸備份工作原理詳解一、核心算法:差異傳輸二、傳輸流程三、關鍵技術四、與cp/scp復制的本質區別rsync的使用基本語法常用選項常用組合案例1. **本地目錄同步**2. **遠程同步(SSH協議)**3. **刪除目標端多余文件**4. **排除特定文件**5. **限速傳輸(避免占用帶…

【MySQL進階】錯誤日志,二進制日志,mysql系統庫

目錄 一.錯誤日志 1.1 配置錯誤日志 1.1.1 Windows的默認錯誤日志路徑 1.1.2 Unix和Linux系統的默認錯誤日志路徑 1.2 錯誤日志中事件的字段 1.2.1 核心錯誤事件字段 1.2.2.MySQL 錯誤消息的兩種不同輸出渠道 1.2.3 可選錯誤事件字段 1.3. 刷新錯誤日志文件和重命名 二…

day45-nginx復雜跳轉與https

1. ?nginx復雜跳轉 客戶端ip不是內網(172.16/192.168)ip時&#xff0c;維護文件存在時&#xff0c;返回503或者錯誤頁面 1.1. &#x1f4dd;修改配置文件 server {listen 80;server_name re.linux.cn; root /app/code/re/;set $flag 0;if ( $remote_addr !~* "^172…

基于pcl點云庫實現激光雷達數據采集

基于pcl點云庫實現倍加福R2000激光雷達數據采集 一、項目介紹二、開發詳情三、顯示效果展示四、說明 一、項目介紹 最近用pcl庫實現了倍加福R2000激光雷達的數據采集&#xff0c;并實時在viewer上實時更新顯示。軟件的開發是基于vs2019qt插件pcl庫實現&#xff0c;可以完成如下…

微信小程序61~70

1.組件wxml的slot-插槽 在使用基礎組件時&#xff0c;可以在組件中間寫子節點&#xff0c;從而將子節點內容展示到頁面中&#xff0c;自定義組件也可以接收子節點但是要在組件模板中定義節點&#xff0c;承載組件中間的子節點需要使用多個插槽時&#xff0c;要在組件.js中聲明…

03_性能優化:讓軟件呼吸更順暢

引言 在用戶對軟件響應速度近乎苛刻的今天&#xff0c;性能已成為產品競爭力的核心指標。據Google研究&#xff0c;頁面加載時間每增加1秒&#xff0c;轉化率就會下降20%。本文將從前端、后端、移動端三個維度&#xff0c;揭示性能優化的核心策略與實戰技巧&#xff0c;幫助你打…