分布式系列教程(22) -分布式事务解决方案(设计篇)

简介: 分布式系列教程(22) -分布式事务解决方案(设计篇)

引言

昨日跟Java高级工程师陶鹏讨论之后,发现LCN框架的设计还是有一定的缺陷的,譬如“效率低”“入侵性高”。毕竟是第三方公司的框架,还是有点不放心的,今天就来给大家讲解下“分布式事务控制”的框架原理设计。

在上一篇博客《分布式系列教程(21) -分布式事务解决方案(框架篇)》,我们知道了可以使用LCN框架来解决分布式事务,其基本事务控制原理图如下:

仿照LCN事务框架的设计流程,其实我们还是可以手动实现事务框架的。本文只描述思路,通过伪代码来实现。

分布式事务控制框架设计

为了方便理解,引出一个经典的场景:《订单系统调用库存系统案例》

在订单系统中,修改完「订单数据库」内容后,然后再远程调用「库存服务」来修改「库存数据库」内容。当然,这是没有异常的情况下是没有问题的,如果中途出现异常,那么在分布式系统中该如何处理呢?

下面来看看我的设计思路,整体分布式事务设计图如下::

流程图分析(与上图步骤序号无关):
  1. 「发起方」「参与方」 都必须要注册到事务协调者中,建立一个长连接(技术:使用Netty或者MQ技术)。
  2. 「订单服务(发起方)」 调用 「库存服务接口(参与方)」 之前会向 「事务协调者」 请求创建一个事务分组ID(技术:使用注解+AOP技术+分布式锁)。
  3. 「订单服务」 使用HTTP(SpringCloud Feign底层使用HTTP)或者Netty(Dubbo协议底层使用Netty)远程调用 「库存服务接口」 的时候,在HTTP请求头会携带事务分组id「库存服务」。(技术:使用Feign或Dubbo)。
  4. 如果 「库存服务」 获取到对应请求头有事务分组id,那么执行库存服务的逻辑代码,否则不执行(技术:使用AOP技术)。
  5. 「库存服务」 执行完库存业务逻辑代码,会采用“假关闭”(假关闭就是重写JDBC的close,它不会提交事务的),发送逻辑操作成功给 「事务协调者」。(技术:使用JDBC重写+Netty或MQ)。
  6. 「事务协调者」 如果判断事务组的成员都“假关闭”完成了,通知所有参与者真正去提交事务(技术:使用Netty或MQ)。。
可能用到的技术
  • 「注解」:主要用于修饰方法
  • 「AOP」:主要处理事务(开始、提交、回滚)
  • 「Netty或者MQ」:主要用作长连接减小宽带传输,但是耗内存
  • 「分布式锁」:主要用于事务协调者生成事务分组id,保证唯一性(单机系统直接使用UUID、时间戳或者雪花算法,分布式系统使用Redis、DB或Zookeeper生成)。
  • 「JDBC重写」:主要重写JDBC close方法(因为只有JDBC close掉才能真正的执行SQL实现持久化)。
  • 「协议交互」:HTTP(推荐使用SpringCloud声明式服务Feign,底层使用的是HttpClient)或Netty(推荐使用Dubbo,Dubbo底层使用的是Netty)。
题外话

很多人在学习事务的时候,都会用到 开启事务begin()、提交事务commit()、回滚事务方法rollback(),也许会提出疑问,为什么执行完插入或更新的SQL之后的代码报异常,调用rollback方法,这些SQL没有生效呢?其底层原理又是怎样的?下面来看看数据库等操作的流程图:

以上是本人对分布式事务解决框架的一些想法,也是个人的见解,有疑问的同学可以留下评论。实现起来是没这么简单的,如果时间允许的情况下,会手写分布式事务框架的例子给各位同学们看下(本文完)。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
5天前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
8天前
|
存储 监控 数据可视化
性能监控之JMeter分布式压测轻量日志解决方案
【8月更文挑战第11天】性能监控之JMeter分布式压测轻量日志解决方案
26 0
性能监控之JMeter分布式压测轻量日志解决方案
|
1月前
|
存储 NoSQL 算法
实现分布式锁的Java解决方案
实现分布式锁的Java解决方案
|
29天前
|
消息中间件
分布式篇问题之通过本地消息表实现分布式事务的最终一致性问题如何解决
分布式篇问题之通过本地消息表实现分布式事务的最终一致性问题如何解决
|
29天前
|
存储 数据管理 数据库
现代数据库技术中的分布式一致性问题与解决方案探讨
分布式系统在现代数据库技术中扮演着重要角色,但分布式环境下的数据一致性问题始终是挑战之一。本文深入探讨了分布式一致性的核心概念、各种一致性模型的特点及其在实际应用中的优缺点,旨在为技术从业者提供全面的视角和实用的解决方案。
|
1月前
|
消息中间件 Java 中间件
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
29 0
|
1月前
|
存储 NoSQL 算法
实现分布式锁的Java解决方案
实现分布式锁的Java解决方案
|
26天前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
29天前
|
NoSQL Java Redis
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
|
1月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略