[Java复习] 分布式事务 Part 2
分布式事务了解吗?如果解决分布式事务问题的?
面试官心里:
只要聊到你做了分布式系统,必问分布式事务,起码得知道有哪些方案,一般怎么来做,每个方案的优缺点是什么。
为什么要有分布式事务?
分布式事务实现的几种方案:
1. 两阶段提交方案/XA方案
这种分布式事务方案,比较适合单块应用里。跨多个库的分布式事务,由于因为严重依赖于数据库层面来搞定复杂的事务,效率很低,绝对不适合高并发的场景。
如果要玩儿,那么基于 Spring + JTA 就可以搞定。
这个方案,很少用,一般来说某个系统内部如果出现跨多个库的这么一个操作,是不合规的。
如果你要操作别人的服务的库,你必须是通过调用别的服务的接口来实现,绝对不允许交叉访问别人的数据库。
2. TCC(Try, Confirm, Cancel)方案
使用补偿机制。分三个阶段:
- Try 阶段:这个阶段说的是对各个服务的资源做检测以及对资源进行锁定或者预留。
- Confirm 阶段:这个阶段说的是在各个服务中执行实际的操作。
- Cancel 阶段:如果任何一个服务的业务方法执行出错,那么这里就需要进行补偿,就是执行已经执行成功的业务逻辑的回滚操作。(把那些执行成功的回滚)
缺点:与业务耦合太紧,事务回滚严重依赖自己的写的代码来回滚和补偿。
适用场景:与钱打交道的场景,支付,交易。需要TCC,严格保证分布式事务要么全部成功,要么全部自动回滚,严格保证资金的正确性。
3. 本地消息表
大概流程:
1. A系统在处理本地事务的同时插入一条数据到消费表。
2. 然后A系统将这个消息发送到MQ。
3. B系统接收到消息后,在一个事务里,先往自己本地消息表插入一条记录,然后执行业务处理;
如果这个消息已经被处理过,则消息表插入失败,事务回滚,保证不会重复处理消息。
4. 如果B系统处理成功,则更新自己本地消费表状态和A系统消费表状态。
5. 如果B系统处理失败,则不会更新消息表状态,A系统会定期扫描自己的消息表,如果有未处理的消息,会再次发送到MQ中,让B系统再次处理。
6. 这个方案保证最终一致性,哪怕B系统事务失败,但A会不断重发消息,直到B成功为止。
缺点:严重依赖数据库的消息表来管理事务。高并发场景怎么办,访问消息表瓶颈,不容易扩展。
4. 可靠消息最终一致性方案(国内互联网流行)
不用本地消费表,直接基于MQ来实现事务。比如阿里的RocketMQ就支持消息事务。
大概流程:
1. A系统发一个prepared消息到MQ,如果这个消息失败则直接取消操作。
2. 如果这个prepared消息发送成功,则执行本地事务,如果事务执行成功就发送confirm消息到MQ,如果失败就告诉MQ回滚消息。
3. 如果发送了confirm消息,则MQ让B系统消费这条confirm消息,然后执行本地事务。
4. MQ会定时轮询所有prepared消息,然后回调A系统接口,查看这个消息是回滚还是要重发一次confirm消息。
一般情况A系统查看本地事务是否执行成功,如果回滚了,则消息也回滚。避免本地事务执行成功,而confirm消息发送失败。
5. 如果B系统事务失败,则不断重试直到成功。如果实在不行,则想办法通知A系统回滚,或发送报警由人工来手动回滚或补偿。
你们公司怎么处理分布式事务?
如果是严格资金场景,用的TCC方案;
如果是订单插入之后要调用库存服务更新库存,可以用可靠消息最终一致性方案。
一般情况不应该使用分布式事务,代码复杂,性能太差。普通的A调用B,C,D,根本不用做分布式事务。
一般就是监控(发邮件,发短信报警),记录日志(一旦出错,完整的日志),事后快速的定位,排查和解决方案,临时修复数据。
比做分布式事务的成本要低很多。
参考资料:
《互联网Java进阶面试训练营》的笔记 -- 中华石杉
[Java复习] 分布式事务 Part 2的更多相关文章
- [Java复习] 分布式事务 Part 1
1. CAP理论 C: Consistency 一致性 A: Availability 可用性 P: Partition tolerance 分区容错性 CAP定理:一个分布式系统不可能同时满足CAP ...
- [Java复习] 分布式锁 Zookeeper Redis
一般实现分布式锁都有哪些方式? 使用 Redis 如何设计分布式锁?使用 Zookeeper 来设计分布式锁可以吗? 这两种分布式锁的实现方式哪种效率比较高? 1. Zookeeper 都有哪些使用场 ...
- [Java复习] 分布式PRC - Dubbo
分布式RPC框架 dubbo常见问题: 1. 问dubbo的工作原理:服务注册,注册中心,服务生产者,消费者,代理通信,负载均衡 2. 问网络通信,序列化: dubbo协议,长连接,NIO,hessi ...
- [Java复习] 分布式高可用-Hystrix
什么是Hystrix? Hystrix 可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制. Hystrix 的设计原则 对依赖服务调用时出现的调用延迟和调用失败进 ...
- Java之分布式事务TCC
看这个博客吧! 挺好的. 理论:https://www.cnblogs.com/jajian/p/10014145.html 实践:https://www.cnblogs.com/sessionbes ...
- Java 分布式事务
0 引言 本文主要介绍java中分布式事务以及对应的解决方案. 1 分布式事务产生的原因 1.1 数据库分库分表 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理在此 ...
- JAVA分布式事务原理及应用(转)
JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据. JDBC驱动程序的JTA支持极大地增强了数据访问能力. 本文的目 ...
- Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)
在本系列先前的文章中,我们主要讲解了JDBC对本地事务的处理,本篇文章将讲到一个分布式事务的例子. 请通过以下方式下载github源代码: git clone https://github.com/d ...
- JAVA分布式事务原理及应用
JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序的JTA支持极大地增强了数据访问能力. 本文的目的是要 ...
随机推荐
- PAT基础级-钻石段位样卷2-7-5 福到了 (15 分)
“福”字倒着贴,寓意“福到”.不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出.这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格.而倒过来的汉 ...
- tcp的三次握手和四次挥手(二)
一.三次握手 三次握手概念 当面试官问你为什么需要有三次握手.三次握手的作用.讲讲三次握手的时候,我想很多人会这样回答. 首先很多人会先讲下握手的过程: 第一次握手:客户端给服务器发送一个 SYN 报 ...
- 用BCB 画 Code128 B模式条码
//--------------------------------------------------------------------------- #include <vcl.h> ...
- EXCEL导入数据到SQL SERVER 2008
项目中需要导入excel到SQL SERVER数据库 总是报截断, 本质问题是,SQL SERVER导入程序是根据EXCEL的第一行记录 (非标题行)来决定数据长度的 碰到这个问题,可以伪造第一行,然 ...
- Class文件中的常量
常量池计数器 常量池是class文件中非常重要的结构,它描述着整个class文件的字面量信息. 常量池是由一组constant_pool结构体数组组成的,而数组的大小则由常量池计数器指定. 常量池计数 ...
- 新闻系统——VS制作自己的模板
我们在做机房管理的项目时,就用过模板方法,建立一个模板,这样就会省很多事,我们不需要每次都添加同样的东西,比如我们的类窗体,就可以制作一个模板,将注释和需要引用的控件直接添加上,这可以省去很大的麻烦, ...
- 设置input 中placeholder的样式
::-webkit-input-placeholder { /* Chrome/Opera/Safari */ position: relative; top: 4px; } ::-moz-place ...
- 前端学习笔记--html入门
1.什么是html 2.标签和元素: 标签可嵌套,要注意缩进 html文档中的元素分为:内容文本.标签 3.标签和属性: 4.html的文件结构: 5.标签 a标签: 还不知道跳转到哪里,可以使用虚拟 ...
- 泛型 System.Collections.Generic及泛型继承、运算符、结构、接口、方法、委托、事件、可空类型等
一.定义泛型类 void Main() { //实例化泛型类时,才指定具体的类型 MyGenericClass<); Console.WriteLine(MyGeneri.InnerT1Obje ...
- python 虚拟环境相关命令
1.总是记不住一些关于创建虚拟环境得命令,特在自己得博客里记录一下自己常用得命令: virtualenv -p C:\Python36\python D:\virtual\Envs\AssetScan ...