Dubbo 分布式事务一致性实现
Dubbo只需实现可被事务管理即可,
像JDBC和JMS都是可被事务管理的分布式资源,
Dubbo只要实现相同的可被事务管理的行为,比如可以回滚,
其它事务的调度,都应该由专门的事务管理器实现。
在Java中,分布式事务主要的规范是JTA/XA,
其中:JTA是Java的事务管理器规范,
XA是工业标准的X/Open CAE规范,可被两阶段提交及回滚的事务资源定义,
比如某数据库实现了XA规范,则不管是JTA,还是MSDTC,都可以基于同样的行为对该数据库进行事务处理。
在JTA/XA中,主要有两个扩展点:
(1) TransactionManager
JTA事务管理器接口,实现该接口,即可完成对所有XA资源的事务调度,比如BEA的Tuxedo,JBossJTA等。
(2) XAResource
XA资源接口,实现该接口,即可被任意TransactionManager调度,比如:JDBC的XAConnection,JMS的XAMQ等。
而Dubbo的远程服务,也应该是一个XAResource,比如:XAInvoker和XAExporter,
Dubbo只需在第一次提交时,将请求发到服务提供方进行缓存和写盘,
在第二次提交时,再基于缓存调用服务的Impl实现,
当然一些健状性分支流程要考虑清楚。
JTA/XA的基本原理如下:
1. 用户启动一个事务:
- transactionManager.begin();
2. 事务管理器在当前线程中初始化一个事务实例:
- threadLocal.set(new TransactionImpl());
3. 用户调用JDBC或JMS或Dubbo请求,请求内部初始化一个XAResource实例:
- XAResource xaResource = new XAResourceImpl(); // 比如:XAConnection
4. JDBC或JMS或Dubbo内部从当前线程获取事务:
- Transaction transaction = transactionManager.getTransaction(); // 其内部为:threadLocal.get();
5. 将当前XAResource注册到事务中:
- transaction.enlistResource(xaResource);
6. 用户提交一个事务:
- transactionManager.commit(); // 其内部为:getTransaction().commit();
7. 事务for循环调用所有注册的XAResource的两阶段提交:
- Xid xid = new XidImpl();
- for (XAResource xaResource: xaResources) {
- xaResource.prepare(xid);
- xaResource.commit(xid, true);
- xaResource.commit(xid, false);
- }
8. 当然,还有一些异常流程,比如rollback和forget等。
举例:
- TransactionManager transactionManager = ...; // 从JNDI进行lookup等方式获取
- transactionManager.begin(); // 启动事务
- try {
- jdbcConn.executeUpdate(sql); // 执行SQL语句,DB写入binlog,但不更新表
- jmsMQ.send(message); // 发送消息,MQ记录消息,但不进入队列
- dubboService.invoke(parameters); // 调用远程服务,Provider缓存请求信息,但不执行
- transactionManager.commit(); // 提交事务,数据库,消息队列,远程服务同时提交
- } catch(Throwable t) {
- transactionManager.rollback(); // 回滚事务,数据库,消息队列,远程服务同时回滚
- }
Dubbo 分布式事务一致性实现的更多相关文章
- 六:分布式事务一致性协议paxos的分析
最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bitbucket.o ...
- 三:分布式事务一致性协议2pc和3pc
一:分布式一致性协议--->对于一个分布式系统进行架构设计的过程中,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是就产生了一系列的一致性协议.--->长期探索涌现出一大批经典的一 ...
- 【原】ActiveMq实现分布式事务一致性
前言:关于分布式事务话题一直是颇有争议的话题,在本文中通过ActiveMq 实现分布式事务做一个简单的demo;同时也让自己能在实践中可以获取经验和对分布式事务自己的一些思考. 1.本地事务 我们通常 ...
- 五:分布式事务一致性协议paxos的应用场景
1.应用场景 (1)分布式中的一致性 Paxos算法主要是解决一致性问题,关于“一致性”,在不同的场景有不同的解释: NoSQL领域:一致性更强调“能读到新写入的”,就是读写一致性数据库领域:一致性强 ...
- 四:分布式事务一致性协议paxos通俗理解
转载地址:http://www.lxway.com/4618606.htm 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La" ...
- 分布式事务 spring 两阶段提交 tcc
请问分布式事务一致性与raft或paxos协议解决的一致性问题是同一回事吗? - 知乎 https://www.zhihu.com/question/275845393 分布式事务11_TCC 两阶段 ...
- 分布式事务(四)之TCC
在电商领域等互联网场景下,传统的事务在数据库性能和处理能力上都暴露出了瓶颈.在分布式领域基于CAP理论以及BASE理论,有人就提出了柔性事务的概念.在业内,关于柔性事务,最主要的有以下四种类型:两阶段 ...
- 分布式事务框架-Litx补偿事务框架源码解析
前言 之前某段时间在研究分布式事务过程中,对实现原理比较好奇,于是去Gitee上找了几个人气比较高的框架进行学习,其中印象深刻的有Litx,因为Litx源码不多,且都是基于Spring和Dubbo底层 ...
- 基于Dubbo的分布式事务框架(LCN)
原文地址:http://原文地址:https://github.com/1991wangliang/transaction 基于Dubbo的分布式事务框架(LCN) 该框架依赖Redis/dubbo/ ...
随机推荐
- Uncaught TypeError: Cannot read property ‘split’ of undefined
问题 :Uncaught TypeError: Cannot read property ‘split’ of undefinedat HTMLLIElement. split()切割的问题 因为遍历 ...
- matlab读取图片的异常表现
在对人脸图片进行对齐时,发现有两张人脸图片一直检测不到人脸,但这两张图片中的人脸明明很好检测(证件照),经过 排查,最终发现问题所在:图片的格式不对. img = imread("**.jp ...
- PHP批量更新数据
/** * 批量更新函数 * @param $data array 待更新的数据,二维数组格式 * @param array $params array 值相同的条件,键值对应的一维数组 * @par ...
- vsftp搭建
(1)下载 yum install -y vsftpd (2)目录详情 /etc/vsftpd/vsftpd.conf:vsftpd 的核心配置文件 /etc/vsftpd/ftpusers:用于指定 ...
- docker 安装kafka
1.下载镜像这里使用了wurstmeister/kafka和wurstmeister/zookeeper这两个版本的镜像 docker pull wurstmeister/zookeeperdocke ...
- jsonp实现跨域资源共享原理
- ZJOI2019Day2 游记
原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day2 游记 4-23 乘车. 报到. 自闭. 晚上没睡好. 4-24 上午张哲宇讲课. 幕后点人上去讲题. 然 ...
- 4.BN推导
参考博客:https://www.cnblogs.com/guoyaohua/p/8724433.html 参考知乎:https://www.zhihu.com/question/38102762/a ...
- Jmeter选项含义
最近接了组里压测的任务,开始仔细钻研Jmeter了.之前也压过,但每次RD问压测的指标等问题,感觉都很懵不知道该怎么回答.借这个机会一鼓作气搞明白吧! Jmeter安装插件 有个插件叫jp@gc St ...
- altiumdesigner的基本你操作
一:中英文切换 DXP ->Preferences ->System ->General ->Localization(使用本地资源) 本地资源对应的是汉语