写点什么

Spring Cloud 分布式事务详解及 LCN 解决方案,mybatis 底层原理

作者:Java高工P7
  • 2021 年 11 月 10 日
  • 本文字数:2078 字

    阅读完需:约 7 分钟

微服务间通过 REST、RPC 等形式交互,相对于单体模式,需要考虑被调用方故障、过载、消息丢失等各种异常情况,代码逻辑更加复杂。


对于微服务间的事务性操作,因为不同的微服务采用了不同的数据库,将无法利用数据库本身的事务机制保证一致性,需要引入二阶段提交等技术。


同时,在微服务间存在少部分共用功能但又无法提取成微服务时,各个微服务对于这部分功能通常需要重复开发,或至少要做代码复制,以避免微服务间的耦合,增加了开发成本。


2. 运维复杂


在采用微服务架构时,系统由多个独立运行的微服务构成,需要一个设计良好的监控系统对各个微服务的运行状态进行监控。运维人员需要对系统有细致的了解才对够更好的运维系统。


3. 影响性能


相对于单体架构,微服务的间通过 REST、RPC 等形式进行交互,通信的时延会受到较大的影响。


分布式事务的引入


========


正如上面所说


对于微服务间的事务性操作,因为不同的微服务采用了不同的数据库,将无法利用数据库本身的事务机制保证一致性,需要引入二阶段提交等技术。


在单体项目中,很容易做到事务控制,而在多个服务之间很难实现


假设服务调用如下:



A B C D 的事务均在各个服务控制,如何做到,统一协调,保


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


证数据的一致性?


分布式事务解决方案


=========


基于 XA 协议的两阶段提交




XA 是一个分布式事务协议,由提出。XA 中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如 Oracle、DB2 这些商业数据库都实现了 XA 接口,而事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。XA 实现分布式事务的原理如下:


第一阶段:



第二阶段:



总的来说,XA 协议比较简单,而且一旦商业数据库实现了 XA 协议,使用分布式事务的成本也比较低。但是,XA 也有致命的缺点,那就是性能不理想,特别是在交易下单链路,往往并发量很高,XA 无法满足高并发场景。XA 目前在商业数据库支持的比较理想,在 mysql 数据库中支持的不太理想,mysql 的 XA 实现,没有记录 prepare 阶段日志,主备切换回导致主库与备库数据不一致。许多 nosql 也没有支持 XA,这让 XA 的应用场景变得非常狭隘。


消息事务+最终一致性




所谓的消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式事务里,保证要么本地操作成功成功并且对外发消息成功,要么两者都失败,开源的 RocketMQ 就支持这一特性.


该方案采用最终一致的,牺牲了一致性,换来了性能的大幅度提升。存在造成数据不一致的风险


TCC 编程模式




所谓的 TCC 编程模式,也是两阶段提交的一个变种。TCC 提供了一个编程框架,将整个业务逻辑分为三块:Try、Confirm 和 Cancel 三个操作。以在线下单为例,Try 阶段会去扣库存,Confirm 阶段则是去更新订单状态,如果更新订单失败,则进入 Cancel 阶段,会去恢复库存。总之,TCC 就是通过代码人为实现了两阶段提交,不同的业务场景所写的代码都不一样,复杂度也不一样,因此,这种模式并不能很好地被复用。


具体实现


====


LCN




https://github.com/codingapi/tx-lcn


LCN 分布式事务框架的核心功能是对本地事务的协调控制,框架本身并不创建事务,只是对本地事务做协调控制。因此该框架与其他第三方的框架兼容性强,支持所有的关系型数据库事务,支持多数据源,支持与第三方数据库框架一块使用(例如 sharding-jdbc),在使用框架的时候只需要添加分布式事务的注解即可,对业务的侵入性低。LCN 框架主要是为微服务框架提供分布式事务的支持,在微服务框架上做了进一步的事务机制优化,在一些负载场景上 LCN 事务机制要比本地事务机制的性能更好,4.0 以后框架开方了插件机制可以让更多的第三方框架支持进来。


目前 LCN 为 4.1 版本


主要特点:


  • 支持各种基于 spring 的 db 框架

  • 兼容 SpringCloud、Dubbo、motan

  • 使用简单,低依赖,代码完全开源

  • 基于切面的强一致性事务框架

  • 高可用,模块可以依赖 RPC 模块做集群化,TxManager 也可以做集群化

  • 支持本地事务和分布式事务共存

  • 支持事务补偿机制,增加事务补偿决策提醒


采用强一致性方案,事务要不全部成功,要不全部失败,保证了事务的一致性,代码简单,原有项目只需引入相关 jar 包,并在需要参与的事务的方法添加注解即可,节省了代码改造成本.


Spring Cloud 示例:


添加依赖


<properties>


<lcn.last.version>4.1.0</lcn.last.version>


</properties>


<dependency>


<groupId>com.codingapi</groupId>


<artifactId>transaction-springcloud</artifactId>


<version>${lcn.last.version}</version>


</dependency>


<dependency>


<groupId>com.codingapi</groupId>


<artifactId>tx-plugins-db</artifactId>


<version>${lcn.last.version}</version>


</dependency>


在需要执行的事务上添加注解


@Override


@TxTransaction(isStart = true)


@Transactional


public int save() {


}


其中 @TxTransaction(isStart = true)lcn 事务控制注解,其中isStart = true 表示该方法是事务的发起方例如,服务 A 需要调用服务 B,服务 B 需要调用服务 C,此时 服务 A 为服务发起方,其余为参与方,参与方只需@TxTransaction 即可。

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Spring Cloud 分布式事务详解及LCN解决方案,mybatis底层原理