标题:阿里分布式事务 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 为分布式系统中的事务处理提供了一种可靠的解决方案,它可以帮助开发人员轻松应对高并发、分布式环境下的事务挑战,提高系统的可靠性和稳定性。
评论列表