Seata分散式事務框架原理詳解

一、Seata原理詳解

Seata 是一個高性能、易用的分散式事務解決方案,提供了 AT/ TCC/ Saga 三種分散式事務模式,並支持 Spring、Dubbo 以及 Node.js 等多種技術棧。它提供了全局唯一的事務 ID,以及基於本地多階段提交協議、全局鎖的機制來實現分散式事務的一致性。

Seata 的整體分為 TC、RM、TM 三個部分:

TC(Transaction Coordinator): 全局事務協調者,負責全局事務的創建、提交和回滾等。在整個分散式事務中起到重要的協調作用,確保全局事務的一致性和可靠性。

TM(Transaction Manager): 事務管理器,負責本地事務的操作,包括本地事務的創建、提交和回滾等。與 TC 配合工作,實現分散式事務的管理。

RM(Resource Manager):資源管理器,負責本地資源的管理,在 Seata 中就是資料庫。RM 因為修改了數據,也要保證分散式事務的一致性。

二、Seata原理是誰

Seata分散式事務框架是阿里巴巴集團於2019年推出的一個開源分散式事務框架,由鳥哥(余國躍)帶領的阿里雲中間件事業部孵化開發。鳥哥是阿里雲中間件事業部資深技術專家,涉及阿里雲分散式存儲、消息隊列、分散式事務等多個領域。

三、Seata原理案例

下面是 Seata 官方提供的一個訂單表與庫存表的分散式事務案例:


// 訂單服務介面
public interface OrderService {
    public boolean createOrder(Order order);
}

// 訂單表
create table order(
    id int auto_increment primary key,
    user_id int not null,
    product_id int not null,
    product_count int not null,
    add_time datetime not null,
    update_time datetime not null
);

// 庫存服務介面
public interface ProductService {
    public boolean reduceStock(Product product);
}

// 庫存表
create table product(
    id int auto_increment primary key,
    product_id int not null,
    stock_count int not null,
    add_time datetime not null,
    update_time datetime not null
);

在這個分散式事務案例中,訂單服務需要調用庫存服務,當訂單服務創建訂單成功後,需要更新庫存表,減少對應商品的庫存。這個過程中,如果有任何一個服務出現異常,就需要回滾之前的所有操作,保證數據的一致性。

四、Seata原理TCC和AT

Seata 支持 AT 和 TCC 兩種分散式事務模式。

1. Seata TCC 模式

Seata TCC(Try-Confirm-Cancel)模式,一般用於業務流程比較複雜、需要參與者自己編寫業務邏輯的場景。在 TCC 中,參與者需要自己實現 Try、Confirm、Cancel 三個階段的業務邏輯。

Try 階段通常是在主業務中創建一個唯一標示的分散式事務,並記錄 TCC 方法的執行順序與回滾操作信息;Confirm 階段通常是在主業務提交成功後執行,以確認各參與者執行結果,如果出現異常則需要回滾操作;Cancel 階段通常是在超時、或回滾業務後執行,以釋放資源和鎖。

2. Seata AT 模式

Seata AT(Automatic Transaction)模式,又稱作 XA 模式,與 TCC 模式相比,AT 更加簡單,不需要程序員手動實現 Try、Confirm、Cancel 三個階段的業務邏輯。AT 模式採用了全局公共鎖來保證各分支事務的一致性和可靠性。

五、Seata AT原理

Seata AT 模式,是採用了 XA (eXtended Architecture)的技術實現的分散式事務。

XA 是一個分散式事務協議和介面規範,在 Seata 中,XA 起到了很重要的作用,是實現分散式事務的關鍵之一。在 XA 協議下,分散式事務的流程如下:

1. TM(Transaction Manager)創建一個全局唯一的事務 ID,先後通知各個 RM 開啟本地事務;

2. TM 開始全局事務,各 RM 結束本地事務;

3. 各 RM 向 TM 報告本地事務的狀態,TM 根據各 RM 報告的狀態,進行全局事務的提交或回滾。

六、阿里巴巴Seata原理

阿里巴巴 Seata 原理是基於全局唯一的事務 ID 來解決分散式事務一致性和可靠性的。在 Seata 中,TC 為全局唯一的事務 ID 生成器,向 TM 發送分配事務 ID 請求。TM 創建具有全局事務 ID 的本地事務,對 RM 發起分支事務請求,每個 RM 按照分支事務請求創建本地事務,最後,TM 收到 RM 的反饋後,對分散式事務進行提交或回滾操作。

七、Seata框架

Seata 框架整體上是由 TC(Transaction Coordinator)、RM(Resource Manager)、TM(Transaction Manager)和 MSE(Message Sender)四個模塊組成的分散式事務解決方案。在 Seata 中,使用 Java 語言來實現整個分散式事務框架。

八、Seata分散式

Seata 分散式主要是通過對事務進行全局的管理和控制,來確保分散式事務的一致性和可靠性。在分散式應用場景中,不同的節點可能位於不同的地方,而這些節點之前可能會有通信延遲、不可靠的網路等問題。Seata 分散式主要考慮了這些因素,引入了 Heartbeat 等技術來處理節點通信延遲或故障的問題。

九、Seata 三大模式

1. Seata AT 模式

Seata AT 模式採用了 XA 協議,在分散式事務過程中,Seata AT 通過事務管理器來實現全局事務的管理和控制,從而確保分散式事務的一致性和可靠性。在 AT 模式中,使用全局公共鎖來防止數據被多方操作問題。

2. Seata TCC 模式

Seata TCC 是一種分散式事務模式,相對於 AT 模式,TCC 模式具有更高的可擴展性。與AT模式不同的是,TCC模式下,業務邏輯中 Try、Confirm、Cancel 操作需要業務開發人員自行實現。Try 階段一般用來預留業務數據,Confirm 階段一般用來確認業務數據,而 Cancel 階段一般用來釋放業務資源。

3. Seata SAGA 模式

Seata Saga 模式是一種基於自動補償機制的分散式事務模式。在 Saga 模式下,Seata 主要通過對事務進行狀態記錄,來確保分散式事務的一致性和可靠性。在分散式事務過程中,當一個事務執行失敗時,Seata 就會自動回滾該事務。

十、Seata的幾種模式選取

在使用 Seata 的過程中,開發人員可以根據實際需求,選擇不同的分散式事務模式來實現分散式事務的控制和管理。對於事務較為簡單的情況,可以選擇 Seata AT 模式來處理;對於事務較為複雜的情況,可以選擇 Seata TCC 或 Saga 模式來處理。

代碼示例

1. Seata AT 模式示例

在 Seata AT 模式下,可以通過在 Spring Boot 項目中添加 seata-spring-boot-starter 依賴,來實現分散式事務的控制和管理。

添加依賴

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    <version>1.4.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>
配置文件

# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource

# SEATA
spring.cloud.alibaba.seata.tx-service-group = seata-tx-group
feign.hystrix.enabled = false

# MyBatis
mybatis.mapper-locations = classpath:mapper/*.xml

mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# Spring
spring.application.name=springcloud-storage-service
server.port=8081
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
分散式事務管理器

@Data
@Configuration
public class DataSourceProxyConfig {

    @Autowired
    private DataSourceProperties dataSourceProperties;

    @Bean
    public DataSource dataSource() {

        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(dataSourceProperties.getUrl());
        datasource.setUsername(dataSourceProperties.getUsername());
        datasource.setPassword(dataSourceProperties.getPassword());
        datasource.setDriverClassName(dataSourceProperties.getDriverClassName());

        // spring datasource 監控配置
        datasource.setFilters("stat,wall,log4j");
        datasource.setMaxActive(20);
        datasource.setInitialSize(1);
        datasource.setMaxWait(60000);
        datasource.setMinIdle(1);
        datasource.setValidationQuery("select 'x'");
        datasource.setTestOnBorrow(false);
        datasource.setTestOnReturn(false);
        datasource.setTestWhileIdle(true);
        datasource.setTimeBetweenEvictionRunsMillis(60000);
        datasource.setMinEvictableIdleTimeMillis(25200000);

        try {
            datasource.setFilters("stat");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return new DataSourceProxy(datasource);
    }
}

2. Seata TCC 模式示例

在 Seata TCC 模式下,需要在業務邏輯中實現 Try、Confirm、Cancel 三個階段的業務邏輯。

介面定義

<pre

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/200888.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-06 11:28
下一篇 2024-12-06 11:28

相關推薦

  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Zlios——一個多功能的開發框架

    你是否在開發過程中常常遇到同樣的問題,需要不斷去尋找解決方案?你是否想要一個多功能、易於使用的開發框架來解決這些問題?那麼,Zlios就是你需要的框架。 一、簡介 Zlios是一個…

    編程 2025-04-29
  • KeyDB Java:完美的分散式高速緩存方案

    本文將從以下幾個方面對KeyDB Java進行詳細闡述:KeyDB Java的特點、安裝和配置、使用示例、性能測試。 一、KeyDB Java的特點 KeyDB Java是KeyD…

    編程 2025-04-29
  • agavi開發框架

    Agavi是一個基於MVC模式的Web應用程序開發框架,以REST和面向資源的設計為核心思想。本文章將從Agavi的概念、優點、使用方法和實例等方面進行詳細介紹。 一、概念 Aga…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • Python unittest框架用法介紹

    Python unittest框架是Python自帶的一種測試框架,可以用來編寫並運行測試用例。在本文中,我們將從以下幾個方面詳細介紹Python unittest框架的使用方法和…

    編程 2025-04-29
  • com.alipay.sofa.bolt框架

    com.alipay.sofa.bolt框架是一款高性能、輕量級、可擴展的RPC框架。其廣泛被應用於阿里集團內部服務以及阿里雲上的服務。該框架通過NIO支持高並發,同時還內置了多種…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • Java Hmily分散式事務解決方案

    分散式系統是現在互聯網公司架構中的必備項,但隨著業務的不斷擴展,分散式事務的問題也日益凸顯。為了解決分散式事務問題,Java Hmily分散式事務解決方案應運而生。本文將對Java…

    編程 2025-04-28

發表回復

登錄後才能評論