问题:

有一个请求去调用了服务A,A中需要向数据库写入数据,其中A里面又调用了服务B,B中也向服务器写入了一些数据,当A成功调用B之后,B正常执行了,A的操作发生了异常,A操作的数据可以正常回滚,那么问题是B服务的事务如何与A保持一致呢?

解决方案:

服务A与服务B属于不同的应用,通过dubbo远程调用,要做到二者写库操作一同提交/一同回滚,服务A和服务B必须参与同一个跨应用的全局事务,并保证二者对应的DB事务必须作为该全局事务的分支事务。这样,事务管理模块在明确了该全局事务的完成方向(commit/rollback)后,再将该全局事务下的所有分支事务逐个提交/回滚。

这是分布式事务管理的大致逻辑,其中,上述“将所有分支事务逐个提交/回滚”过程是分布式事务处理的关键,需要有相应故障恢复的机制,例如,当服务A的DB事务已经提交(服务B的DB事务尚未提交)时,若服务B所在节点宕机(或其使用的DB宕机)时,如何保证服务B的DB事务仍能正常提交。这个过程的实现机制有很多种,常见的有XA 2PC和TCC。

XA机制将提交过程分成prepare、commit两个阶段,事务管理模块在prepare服务A的DB事务、服务B的DB事务都成功后,再逐个commit这些DB事务。DB在prepare返回OK后,如果没有收到来自事务管理模块的commit/rollback请求则会一直保留该分支事务的数据。因此,若上述宕机故障出现在prepare阶段,则可以通过将prepare过的分支事务回滚,来达到全局事务回滚;若上述宕机故障出现在commit阶段,后续仍然可以再次commit那些未成功commit的分支事务,最终达到全局事务提交。

TCC机制下,事务管理模块是在服务A、服务B执行完毕后即刻提交其参与的DB事务。而后,如果全局事务决定提交,则逐个调用服务A和服务B的confirm逻辑;如果全局事务决定回滚,则逐个调用服务A和服务B的cancel逻辑(当然,confirm/cancel逻辑的执行中又会参与相应的DB事务)。若发生上述宕机故障,则只需要根据全局事务当前状态,将服务A、服务B相应的confirm/cancel逻辑重新调用即可。因confirm/cancel逻辑可能会被多次调用,因此,需要保证其幂等性。

知名的分布式事务管理器主要有atomikos、bitronix、narayana。其中,仅atomikos支持XA和TCC两种机制,bitronix、narayana仅支持XA机制。这三者都不提供对dubbo的开箱即用的支持,需要自行集成。

目前对dubbo提供开箱即用支持的分布式事务管理器有:ByteJTA(基于XA机制)、ByteTCC(基于TCC机制)。

目前比较多的解决方案有几个:
一、结合MQ消息中间件实现的可靠消息最终一致性
二、TCC补偿性事务解决方案
三、最大努力通知型方案
第一种方案:可靠消息最终一致性,需要业务系统结合MQ消息中间件实现,在实现过程中需要保证消息的成功发送及成功消费。即需要通过业务系统控制MQ的消息状态
第二种方案:TCC补偿性,分为三个阶段TRYING-CONFIRMING-CANCELING。每个阶段做不同的处理。
TRYING阶段主要是对业务系统进行检测及资源预留
CONFIRMING阶段是做业务提交,通过TRYING阶段执行成功后,再执行该阶段。默认如果TRYING阶段执行成功,CONFIRMING就一定能成功。
CANCELING阶段是回对业务做回滚,在TRYING阶段中,如果存在分支事务TRYING失败,则需要调用CANCELING将已预留的资源进行释放。
第三种方案:最大努力通知xing型,这种方案主要用在与第三方系统通讯时,比如:调用微信或支付宝支付后的支付结果通知。这种方案也是结合MQ进行实现,例如:通过MQ发送http请求,设置最大通知次数。达到通知次数后即不再通知。
具体的案例你也可以参考下龙果学院这篇博客,它上面有完整的电商系统分布式事务实现案例:龙果社区-微服务架构的分布式事务解决方案
其他解决方案:

首先,要明确 需不需要保证数据的一致性,有些业务场景 就不需要一致性。

而你的既然需要,回滚机制,让对方的服务提供回滚接口,调用方假设调用接口出错,本地的东西 通过本地事物 能回滚,而外部系统 你catch了这个Exception,则要调用它的回滚接口。

转载于:https://www.cnblogs.com/barrywxx/p/8506512.html

微服务间保持事务一致性相关推荐

  1. 实践《如何使用Seata保证Dubbo微服务间的一致性》

    原文在这里:如何使用Seata保证Dubbo微服务间的一致性. 从这里下载sample代码,master分支,最新的代码提交日期是2019.9.16,修订号cd10c5a.本文代码在模块dubbo里. ...

  2. 微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.2 实现XA 模式

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] 分布式事务 文章目录 微服务 ...

  3. Istio:一个用于微服务间通信的服务网格开源项目

    http://www.infoq.com/cn/news/2017/05/istio Istio:一个用于微服务间通信的服务网格开源项目 Google.IBM和Lyft开源了微服务管理.保护和监控框架 ...

  4. 再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!

    在微服务项目中,如果我们想实现服务间调用,一般会选择Feign.之前介绍过一款HTTP客户端工具Retrofit,配合SpringBoot非常好用!其实Retrofit不仅支持普通的HTTP调用,还能 ...

  5. dbnetlib不存在或拒绝访问_idou老师教你学Istio 16:如何用 Istio 实现微服务间的访问控制...

    本文由华为云容器Istio团队撰稿,未经允许谢绝转载. 摘要 使用 Istio 可以很方便地实现微服务间的访问控制.本文演示了使用 Denier 适配器和黑白名单两种方法. 使用场景 有时需要对微服务 ...

  6. 微服务间的调用和应用内调用有啥区别

    摘要 目前大部分的系统架构都是微服务架构,就算没有注册中心.服务管理,也肯定是多个服务,单体服务比较少了. 大家平时需要在应用内调用rpc接口也比较多,那么有没有思考过微服务之间的调用和应用内直接调用 ...

  7. Spring Boot微服务间文件返回实现

    Feign接口获取文件流问题_Java_wyazyf的博客-CSDN博客 https://blog.csdn.net/wyazyf/article/details/93200033 Spring Bo ...

  8. SpringCloudAlibaba 微服务整合分布式事务Seata

    基于AT模式 创建undo_log(回滚日志表)表, 每个数据库需要创建 注意:UNDO_LOG Table:不同数据库在类型上会略有差别.详见官网 -- 注意此处0.7.0+ 增加字段 contex ...

  9. 通过RestTemplate进行微服务间(通过服务名)的调用

    样例: @Slf4j @RestController @RequestMapping(path = "/test") public class TestController {@A ...

最新文章

  1. 2021年AI关键趋势,AI芯片初创公司可能发生并购
  2. 安装spark集群,并成功运行
  3. 机器人总动员最后的bgm_引导你欣赏《机器人瓦力》的电影配乐
  4. javascript全栈开发实践-web-7
  5. 微课|中学生可以这样学Python(例4.6):抓小狐狸游戏
  6. java的jmm模型_【深入理解JVM】:Java内存模型JMM
  7. 如何用git将本地文件放到github上
  8. 如何解决更改csdn头像修改后浏览器不显示的问题
  9. 扶贫计算机考试试题,计算机基础知识试题1.doc
  10. 数据结构之一元多项式
  11. 量子计算的基础知识和基本原理
  12. Java实现九宫格游戏
  13. 手机连接电脑热点后,无法上网
  14. 中国 移动短消息中心号码大全
  15. 【比赛游记】NOI2019打铁记
  16. 计算机会计学试题,会计电算化模拟题及答案
  17. deepin efi 启动u盘_deepin启动引导修复教程
  18. 提升汽车APP用户体验,火山引擎APMPlus的“独家秘笈”
  19. 为什么有时ping不通www.baidu.com但可以访问www.baidu.com网页?
  20. 最酷的linux命令,【分享】十条最酷的Linux命令

热门文章

  1. UIViewAnimationOptions
  2. ie6+7+8等对background-color:rgba(),background-img渐变的兼容
  3. 分布式缓存Memcached---开篇的话
  4. 深入浅出Flex组件生命周期Part4 ─ 引擎LayoutManager【转载】
  5. UML从需求到实现----用例
  6. IIS之错误解决之道
  7. Windows下的函数
  8. 写帮助大家学习的小框架
  9. perl6检测网站CMS脚本(测试代码)
  10. Vue 学习笔记 — css属性计算的问题