关于利用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第二十六章:流程控制语句中循环语句do-while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 跑monkey前开启/关闭系统通知栏
@echo off cls title 别忘了跑monkey啊 :menu cls color 0A echo. .禁用systemui并重启 echo. .启用systemui并重启 echo. e ...
- Linux环境下完成远程系统迁移
一.基础 了解: netcat是个计算机网络公用程式,用来对网络连线TCP或者UDP进行读写.nc命令是netcat命令的简称,都是用来设置路由器.netcat 在2001年insecure.org对 ...
- uC/OS-II 函数之内存管理相关函数
上文主要介绍了邮箱管理相关的函数,本文介绍内存管理相关的函数:OSMemCreate()内存块创建函数,OSMemGet()函数,OSMemPut()函数,OSMemQuery()函数.以前用过的uC ...
- 1、Caffe数据层及参数
要运行Caffe,需要先创建一个模型(model),每个模型由许多个层(layer)组成,每个层又都有自己的参数, 而网络模型和参数配置的文件分别是:caffe.prototxt,caffe.solv ...
- angular5给懒加载模块添加loading
在根组件的构造函数中直接执行: this.router.events.subscribe(event=>{ if(event instanceof RouteConfigLoadEnd) { t ...
- VMware安装黑威联通教程+文件 亲身测试成功 老骥伏枥黑威联通母盘QNAP1G-BOOT 1G
1.首先致敬老骥伏枥大神的帖子. [老骥伏枥-原创]制作黑威联通启动盘:进阶篇 2.其次感谢这位作者的安装教程 作者:f541883216 [老骥伏枥-原创]用我的黑威联通启动盘在WMware搭建系统 ...
- StringBuffer与StringBuilder的区别比较
关于AbstractStringBuilder 首先通过查看源码发现,StringBuffer与StringBuilder都继承自AbstractStringBuilder抽象类.而AbstractS ...
- 使用Maven运行测试提示Module sdk 1.5的解决方法
解决方法: 1. 配置Project Structure 2. 在MAVEN_HOME/conf/setting.xml中添加profile 3. 在Maven项目的pom.xml文件里添加标签 三种 ...
- Django Rest Framework(阿奇)
Django Rest Framework 一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中 ...