分布式系列教程(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
目录
相关文章
|
2月前
|
存储 SQL 微服务
常用的分布式事务解决方案(三)
常用的分布式事务解决方案(三)
|
2月前
|
关系型数据库 MySQL
常见分布式事务的解决方案(一)
常见分布式事务的解决方案(一)
|
1月前
|
消息中间件 存储 算法
分布式系列第二弹:分布式事务!
分布式系列第二弹:分布式事务!
|
1月前
|
SQL NoSQL MongoDB
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
46 0
|
2月前
|
消息中间件 中间件 关系型数据库
常用的分布式事务解决方案(四)
常用的分布式事务解决方案(四)
|
2月前
常用的分布式事务解决方案(二)
常用的分布式事务解决方案(二)
|
3月前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
3月前
|
存储 监控 数据可视化
性能监控之JMeter分布式压测轻量日志解决方案
【8月更文挑战第11天】性能监控之JMeter分布式压测轻量日志解决方案
96 0
性能监控之JMeter分布式压测轻量日志解决方案
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
114 2
基于Redis的高可用分布式锁——RedLock

热门文章

最新文章

下一篇
无影云桌面