黑狐家游戏

阿里分布式事务fescar,阿里分布式编程

欧气 1 0

标题:阿里分布式事务 Fescar 详解与实践

一、引言

在当今数字化时代,企业级应用系统通常需要处理大量并发的事务,以确保数据的一致性和完整性,传统的单体架构在面对高并发、分布式环境时,往往会面临分布式事务的挑战,为了解决这一问题,阿里研发了分布式事务框架 Fescar,它为分布式系统中的事务处理提供了一种可靠的解决方案。

二、Fescar 简介

Fescar 是一款阿里巴巴开源的分布式事务解决方案,它提供了 AT(Automated Transaction)模式和 TCC(Try-Confirm-Cancel)模式两种事务模式,支持多种主流的关系型数据库和消息中间件,Fescar 的核心思想是将一个大的事务拆分成多个小的事务,在每个本地事务执行成功后,将事务信息注册到全局事务中,由全局事务管理器协调各个本地事务的提交或回滚。

三、Fescar 架构

Fescar 主要由三个部分组成:事务协调器(TC)、事务管理器(TM)和资源管理器(RM)。

1、事务协调器(TC):负责全局事务的开启、提交、回滚和注册全局事务信息。

2、事务管理器(TM):负责分支事务的注册、提交、回滚和状态管理。

3、资源管理器(RM):负责管理分支事务对数据库的操作,实现资源的锁定和解锁。

四、Fescar 工作流程

Fescar 的工作流程可以分为以下几个步骤:

1、应用程序发起全局事务:应用程序通过调用 TM 的 start 方法开启一个全局事务,并生成一个全局事务 ID。

2、TM 向 TC 注册全局事务:TM 将全局事务 ID 和其他相关信息注册到 TC 中。

3、应用程序执行业务操作:应用程序在本地事务中执行业务逻辑,并调用 RM 的相应方法对数据库进行操作。

4、RM 向 TC 报告分支事务状态:RM 在本地事务执行成功或失败后,向 TC 报告分支事务的状态。

5、TC 协调全局事务提交或回滚:TC 根据 RM 报告的分支事务状态,协调各个本地事务的提交或回滚。

6、应用程序感知全局事务结果:应用程序通过调用 TM 的 getStatus 方法获取全局事务的状态,并根据状态进行相应的处理。

五、Fescar 两种事务模式

Fescar 提供了 AT 模式和 TCC 模式两种事务模式,下面分别介绍它们的特点和适用场景。

1、AT 模式:AT 模式是 Fescar 默认的事务模式,它基于数据库的两阶段提交实现,在 AT 模式下,应用程序只需要关注业务逻辑,而不需要关心事务的管理和协调,Fescar 会自动在数据源层实现分布式事务的提交和回滚,保证数据的一致性和完整性,AT 模式适用于对性能要求较高的业务场景,如电商、金融等。

2、TCC 模式:TCC 模式是一种基于 Try-Confirm-Cancel 事务的模式,它要求应用程序在业务逻辑中实现 Try、Confirm 和 Cancel 三个方法,分别用于尝试、确认和取消事务,在 TCC 模式下,应用程序需要对业务逻辑有更深入的了解,并且需要在代码中显式地管理事务的提交和回滚,TCC 模式适用于对事务的严格性要求较高的业务场景,如金融交易、医疗等。

六、Fescar 实践案例

下面以一个电商订单系统为例,介绍如何使用 Fescar 实现分布式事务。

1、创建数据库表:我们需要创建订单表和商品表,用于存储订单和商品信息。

CREATE TABLEorder (id BIGINT(20) NOT NULL AUTO_INCREMENT,user_id BIGINT(20) NOT NULL,total_amount DECIMAL(10,2) NOT NULL,status INT(11) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLEproduct (id BIGINT(20) NOT NULL AUTO_INCREMENT,name VARCHAR(50) NOT NULL,stock INT(11) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2、创建实体类:我们需要创建订单实体类和商品实体类,用于封装订单和商品信息。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
    private Long id;
    private Long userId;
    private BigDecimal totalAmount;
    private Integer status;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    private Long id;
    private String name;
    private Integer stock;
}

3、创建Mapper 接口:我们需要创建订单 Mapper 接口和商品 Mapper 接口,用于对订单和商品表进行操作。

public interface OrderMapper extends BaseMapper<Order> {
}
public interface ProductMapper extends BaseMapper<Product> {
}

4、创建 Service 接口:我们需要创建订单 Service 接口和商品 Service 接口,用于封装业务逻辑。

public interface OrderService {
    void createOrder(Order order);
}
public interface ProductService {
    void deductStock(Long productId, Integer amount);
}

5、创建 Service 实现类:我们需要创建订单 Service 实现类和商品 Service 实现类,实现业务逻辑。

@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private ProductMapper productMapper;
    @Override
    public void createOrder(Order order) {
        // 生成全局事务 ID
        String xid = GlobalTransactionContext.getCurrent().getXID();
        // 执行业务逻辑
        try {
            // 插入订单
            orderMapper.insert(order);
            // 扣减商品库存
            productMapper.deductStock(order.getProductId(), order.getAmount());
            // 提交全局事务
            GlobalTransactionContext.getCurrent().commit();
        } catch (Exception e) {
            // 回滚全局事务
            GlobalTransactionContext.getCurrent().rollback(e);
        }
    }
}
@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductMapper productMapper;
    @Override
    public void deductStock(Long productId, Integer amount) {
        // 执行业务逻辑
        productMapper.deductStock(productId, amount);
    }
}

6、配置 Fescar:我们需要配置 Fescar,将其集成到项目中。

@Configuration
public class FescarConfig {
    @Bean
    public GlobalTransactionScanner globalTransactionScanner() {
        GlobalTransactionScanner scanner = new GlobalTransactionScanner();
        scanner.setApplicationId("order-service");
        scanner.setTransactionServiceGroup("fescar");
        return scanner;
    }
}

七、总结

本文介绍了阿里分布式事务框架 Fescar 的基本概念、架构、工作流程和两种事务模式,并通过一个电商订单系统的实践案例,展示了如何使用 Fescar 实现分布式事务,Fescar 为分布式系统中的事务处理提供了一种可靠的解决方案,它可以帮助开发人员轻松应对高并发、分布式环境下的事务挑战,提高系统的可靠性和稳定性。

标签: #阿里 #分布式事务

黑狐家游戏
  • 评论列表

留言评论