关于利用MQ实现分布式事务的想法【转】
转自:https://www.jianshu.com/p/bafb09954f18
假设:消息服务不丢消息
场景 服务A 服务B 服务C 消息服务Q
伪代码
服务A中
transaction{
A本地事务
B.callB();
C.callC();
A本地事务
}
利用消息服务来实现分布式事务
原理 当服务A执行事务时,所有指定远程调用会被转换为发送一条调用消息到消息服务,当B和C接收到消息时,立即执行消息指定的方法,并在提交前发送回复消息给A(携带有返回值)并且等待接收提交或者回滚消息,服务A执行完方法也在提交前等待B和C的回复,当B和C的回复都为sucess时发送提交消息给B和C,然后自己提交,否则回滚。B和C接到提交消息后,提交,否则回滚。
异常情况一:在发送调用B的消息时失败
服务A事务直接回滚
异常情况二:在发送调用C的消息时失败
服务A事务直接回滚,并发送回滚消息到指定队列(此两步操作由Q的事务消息保证原子性)
异常情况三:服务A提交和回滚失败
由于服务A提交和回滚操作和发送提交或者回滚消息在一个事务内,所以放在一起讨论,
由于此部分由消息中间件保证原子性,固提交或者回滚失败,不会有提交或者回滚消息到达消息中间件,B和C等待一段时间后自动回滚
异常情况四:B在发送回复消息时失败
A在等待指定时间后没有收到B的回复,进行回滚操作并发送回滚消息到指定队列,C在收到回滚消息后回滚,B在等待指定时间后没有收到A的提交消息回滚
异常情况五:C在发送回复消息时失败
同异常情况四
异常情况六:B提交失败或者C提交失败
B或C中调用消息和提交消息均不消费,会进行重试
异常情况七:B或者C回滚失败
同异常情况六
异常情况八:B或者C逻辑出现异常导致失败
B或者C直接回滚,并且发送失败回复
停机启动恢复处理
由于异常导致的死机,然后重启后的逻辑
一、只接收到调用消息,执行,然后等待固定时间后回滚。
二、按照顺序接收到调用消息和提交消息,执行然后提交
三、先接收到提交消息后接收到调用消息,一样,执行然后提交
四、接收到调用和回滚消息,同上
从上可以推导出,利用消息系统做分布式事务的两个特性
强调一下假设:消息服务不丢消息
一、在网络畅通所有服务高可用的情况下,可以做到数据的强一致性
二、在网络和服务可能存在故障的情况下,可以做到数据的最终一致性
关于数据在最终一致性情况下的查询问题
1.最好的解决方案是不管,更新后查询数据查到旧的数据就让它查到旧的数据
2.可以利用缓存,自己写逻辑实现,还未提交的数据缓存下来,查询时先查询缓存
关于利用MQ实现分布式事务的想法【转】的更多相关文章
- 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...
- 利用redis实现分布式事务锁,解决高并发环境下库存扣减
利用redis实现分布式事务锁,解决高并发环境下库存扣减 问题描述: 某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖 解决方案一 利用数据 ...
- 3种使用MQ实现分布式事务的方式
1.保证消息传递与一致性 1.1生产者确保消息自主性 当生产者发送一条消息时,它必须完成他的所有业务操作. 如下图: 这保证消费者接受到消息时,生产者已处理完毕相关业务,也就是1PC的基础. 1.2 ...
- 利用RabbitMQ实现分布式事务
实现要点:1.构建本地消息表及定时任务,确保消息可靠发送:2.RabbitMQ可靠消费:3.redis保证幂等 两个服务:订单服务和消息服务 订单服务消息可靠发送 使用springboot构建项目,相 ...
- MQ 分布式事务 -- 微服务应用
1.背景 友情链接:https://www.cnblogs.com/Agui520/p/11187972.html https://blog.csdn.net/fd2025/article/detai ...
- MQ关于实现最终一致性分布式事务原理解析
本文讲述阿里云官方文档中关于通过MQ实现分布式事务最终一致性原理 概念介绍 事务消息:消息队列 MQ 提供类似 X/Open XA 的分布式事务功能,通过消息队列 MQ 事务消息能达到分布式事务的最终 ...
- 对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)
前言 这是<Spring Cloud 进阶>专栏的第六篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得了? 阿里面 ...
- 终于有人把“TCC分布式事务”实现原理讲明白了!
之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一 ...
- 关于分布式事务,XA协议的学习笔记
XA分布式事务协议,包含二阶段提交(2PC),三阶段提交(3PC)两种实现. 1.二阶段提交方案:强一致性 事务的发起者称协调者,事务的执行者称参与者. 处理流程: 1.准备阶段 事务协调者,向所有事 ...
随机推荐
- “全栈2019”Java第十二章:变量
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Ubuntu 16.04.5安装docker
一:安装Ubuntu 16.04.5 下载地址: 1.magnet:?xt=urn:btih:C3C5FE05C329AE51C6ECA464F6B30BA0A457B2CA 2.http://m ...
- Java面向对象之异常(自定义异常)
一.基础概念 在自定义的程序中,如果有了问题.也可以像java中的异常一样,对问题进行描述. 注意:1.继承RuntimeException的异常,不需要进行处理.在执行过程中有异常会直接抛出. 2. ...
- python的数据结构分类,以及数字的处理函数,类型判断
python的数据结构分类: 数值型 int:python3中都是长整形,没有大小限制,受限内存区域的大小 float:只有双精度型 complex:实数和虚数部分都是浮点型,1+1.2J bool: ...
- [转] iOS中@class #import #include 简介
[转载自:http://blog.csdn.net/chengwuli125/article/details/9705315] 一.解析 很多刚开始学习iOS开发的同学可能在看别人的代码 ...
- Touchmove获取当前触摸的Dom节点
原文链接:https://www.jianshu.com/p/a2a41fe20790 Touchmove获取当前触摸的Dom节点 近期为自己的app增加一个通讯录首字母导航的功能,如下图蓝色框部分, ...
- 接口自动化之unittest+ddt
我在上一篇(https://www.cnblogs.com/wlyhy/p/10083318.html) 文章整理了unittest的模板,但在后续学习中,发现还有许多值得优化的地方.例如在我们设计测 ...
- TensorFlow GPU 的使用
一.TensorFlow 设备分配 1.设备分配规则 If a TensorFlow operation has both CPU and GPU implementations, the GPU d ...
- Vivado 的IP:Global 和 Out-Of-Context选项问题
在Vivado定制IP的时候,或者在IP Catalog中双击一个IP,不论该IP是我们自己添加到工程的自定义IP,还是Vivado自己带的IP,选择"Customize IP"后 ...
- 【后渗透】PowerSploit
1.下载安装:git clone https://github.com/mattifestation/PowerSploit.git 2.搭建web服务器(如172.16.12.2),将powersp ...