分布式事务解决方案,无外乎以下几种方式:
- 两阶段提交(2PC)
- 补偿事务(TCC)
- 本地消息表(异步确保)
- MQ 事务消息
- Sagas 事务模型
本文不做原理的实现,推荐具体的能落地的实现方案之一TX-LCN 分布式事务框架。
一、介绍
LCN通讯是基于TCP长连接的socket通讯,TxManager与事务控制方是基于netty框架完成的。该协议只描述参与Socket通讯的协议。
LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果。
LCN 核心采用3PC机制,采用强一致性方案,保证了事务的一致性。
二、框架特点
- 兼容SpringCloud、Dubbo;
- 兼容rpc降级熔断
- 使用简单,低依赖,代码完全开源;
- 基于切面的强一致性事务框架;
- 高可用,模块可以依赖Dubbo或SpringCloud的集群方式做集群化,TxManager也可以做集群化;
- 支持本地事务和分布式事务共存;
缺点:代理的连接需要随事务发起方一并释放连接,增加了连接占用的时间;不适用于热点数据和异步场景。
三、核心步骤
- 创建事务组
- 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。
- 添加事务组
- 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给TxManager的操作。
- 关闭事务组
- 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager的动作。当执行完关闭事务组的方法以后,TxManager将根据事务组信息来通知相应的参与模块提交或回滚事务。
四、事务控制原理
TX-LCN由两大模块组成, TxClient、TxManager,TxClient作为模块的依赖框架,提供TX-LCN的标准支持,TxManager作为分布式事务的控制放。事务发起方或者参与反都由TxClient端来控制。
TxClient的代理连接池实现了javax.sql.DataSource接口,并重写了close方法,事务模块在提交关闭以后TxClient连接池将执行"假关闭"操作,等待TxManager协调完成事务以后在关闭连接。
对于代理连接池的优化
- 自动超时机制
- 任何通讯都有最大超时限制,参与模块在等待通知的状态下也有最大超时限制,当超过时间限制以后事务模块将先确认事务状态,然后再决定执行提交或者回滚操作,主要为了给最大资源占用时间加上限制。
- 智能识别创建不同的连接 对于只读操作、非事务操作LCN将不开启代理功能,返回本地连接对象,对于补偿事务的启动方将开启回滚连接对象,执行完业务以后马上回滚事务。
- LCN连接重用机制 当模块在同一次事务下被重复执行时,连接资源会被重用,提高连接的使用率。
閱讀更多 碼農幫搬 的文章