转自: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实现分布式事务的想法【转】的更多相关文章

  1. 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

    原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...

  2. 利用redis实现分布式事务锁,解决高并发环境下库存扣减

    利用redis实现分布式事务锁,解决高并发环境下库存扣减   问题描述: 某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖 解决方案一 利用数据 ...

  3. 3种使用MQ实现分布式事务的方式

    1.保证消息传递与一致性 1.1生产者确保消息自主性 当生产者发送一条消息时,它必须完成他的所有业务操作. 如下图: 这保证消费者接受到消息时,生产者已处理完毕相关业务,也就是1PC的基础. 1.2 ...

  4. 利用RabbitMQ实现分布式事务

    实现要点:1.构建本地消息表及定时任务,确保消息可靠发送:2.RabbitMQ可靠消费:3.redis保证幂等 两个服务:订单服务和消息服务 订单服务消息可靠发送 使用springboot构建项目,相 ...

  5. MQ 分布式事务 -- 微服务应用

    1.背景 友情链接:https://www.cnblogs.com/Agui520/p/11187972.html https://blog.csdn.net/fd2025/article/detai ...

  6. MQ关于实现最终一致性分布式事务原理解析

    本文讲述阿里云官方文档中关于通过MQ实现分布式事务最终一致性原理 概念介绍 事务消息:消息队列 MQ 提供类似 X/Open XA 的分布式事务功能,通过消息队列 MQ 事务消息能达到分布式事务的最终 ...

  7. 对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)

    前言 这是<Spring Cloud 进阶>专栏的第六篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得了? 阿里面 ...

  8. 终于有人把“TCC分布式事务”实现原理讲明白了!

    之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一 ...

  9. 关于分布式事务,XA协议的学习笔记

    XA分布式事务协议,包含二阶段提交(2PC),三阶段提交(3PC)两种实现. 1.二阶段提交方案:强一致性 事务的发起者称协调者,事务的执行者称参与者. 处理流程: 1.准备阶段 事务协调者,向所有事 ...

随机推荐

  1. OCP题库升级,iZ0-052新加的考题及答案整理-18

    18.You want to Install Oracle 11g database software and create a database on ASM Immediately after t ...

  2. PHP函数补完:call_user_func()

    call_user_func是PHP的内置函数,该函数允许用户调用直接写的函数并传入一定的参数,下面总结下这个函数的使用方法. 1,call_user_func函数类似于一种特别的调用函数的方法,使用 ...

  3. Spark - 经典案例

    初识 Spark 大数据处理,目前还只是小白阶段,初步搭建起运行环境,慢慢学习之. 本文熟悉下 Spark 数据处理的几个经典案例. 首先将 Scala SDK 的源码导入 IDEA,方便查看和调试代 ...

  4. P1444 [USACO1.3]虫洞wormhole

    luogu P1444 [USACO1.3]虫洞wormhole 首先感谢ghj的讲解 题目描述 农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致N个虫洞在农场上(2<=N<=12 ...

  5. 利用Python实现倒序任意整数

    这是很早以前学习C时候做过的一个练习题,题目的要求大概是把用户输入的三位数倒序输出,比如说用户输入123,然后程序应该输出的结果是321.如果遇到用户输入100,那么程序应该输出1.然后我给扩展一下, ...

  6. Quartz .net 禁止并行触发

    DisallowConcurrentExecution 禁用同步执行防止一个job 同一时间执行多次. [DisallowConcurrentExecution] public class Order ...

  7. Vue生命周期钩子详解【个人解读】

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. jsp基础知识总结

    1.了解jsp,jsp有什么有利的,有什么弊端. jsp是serlet的扩展,在web应用中,每个jsp页面都会有servlet容器生产对应的servlet. jsp通过在标准的html页面中插入ja ...

  9. Java - String中的==、equals及StringBuffer(转自CSDN 作者:chenrui_)

    equals是比较值/对象是否相同,==则比较的是引用地址是否相同. ==  如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象 package com.char3; public ...

  10. 《大数据日知录》读书笔记-ch11大规模批处理系统

    MapReduce: 计算模型: 实例1:单词统计 实例2:链接反转 实例3:页面点击统计 系统架构: 在Map阶段还可以执行可选的Combiner操作,类似于Reduce,但是在Mapper sid ...