远程调用时的分布式事物问题

前提

  • 所有服务均有独立的事物管理机制,相互间没有任何关联.
  • 所有业务接口都有对应的补偿方法,用于将已经更新的数据还原到上一次的状态.
  • 本次实例为同步业务,理想状态下,只有全部成功或全部失败两种情况.

正式开始

正常流程

一切安好.

中途异常 - 补偿成功

虽然发生了失败,但所有补偿都成功了.没有什么问题

中途异常 - 补偿失败

此时,主服务有三种处理方法

  1. 主服务无限重试补偿方法,直到补偿成功.
    这里有很麻烦的问题,如果下游的服务器已经停机,此时主服务的无限重试已经没有意义.在最坏的情况下,如果主服务访问量过大,而因为业务相同,主服务的线程池中的全部线程将全部处于阻塞状态,失去处理新请求的能力.
    同时,访问主服务的客户端有可能会放弃本次的连接,导致正在重试中的线程被回收,丢失所有状态
  2. 主服务尽可能调用补偿方法,并回滚自身事物,同时通知备用方案
    这里依靠备用方案对失败的补偿调用进行异步异步调用,已达到"最终一致"的效果.备用方案一般需要集成"可靠消息系统"
  3. 主服务直接放弃补偿与自身的回滚,并通知备用方案
    与2基本相同.在调用链比较长的情况下且补偿随机性失败,从上层看,2方案的调用结果(备用方案未执行时)将成锯齿状.而本方案,其对应
    的消费者直接以级联方式进行补偿的调用,最终完成全部补偿调用与主方法数据回滚,同样从上层看,方案3的调用结果(备用方案未执行时)将是平整的(只有失败处断裂).

方案1直接pass
方案2,3可以使用消息队列与对应的消费者进行实现.但是会有短暂的数据不一致问题

中途异常(伪) - 触发补偿

这种情况具体描述如下

  1. 正常远程调用
  2. 下游业务接收并进行处理
  3. 主服务认为网络超时(如等待数据库锁释放)或发生其他意外,从而触发补偿流程
  4. 下游业务完成请求处理
  5. 主服务发起并执行补偿流程(不包含4涉及的服务)

解决方法

  1. 记录全局唯一识别码,当主服务发起补偿时,所有下游业务应该得知,并出发各自的补偿方法.
  2. 需要注意,在尝试解决过程中,如果主服务过早推送回滚通知,涉及独自提交的服务早于对应业务处理完成进行补偿,将会导致回滚通知失效.

    在这种情况下,上游业务回滚,下游业务独自完成了业务处理,造成数据问题. 会有短暂的数据不一致问题

主服务断电 - 正常运行,补偿中,补偿失败中



此时主服务状态全部丢失且下游业务状态错乱

只能借用可靠消息对进行中的操作进行记录,并在再次开启后进行恢复

总结

  • 在必须要使用RPC进行远程调用且事物复杂的情况下,应使用一个可靠的消息系统保证在各方断电,断网,回滚时能够即使恢复"状态".
  • 同时,应保证严格的幂等性,对于非幂等消息,根据实际情况,进行保留会消耗.
  • 所有经由消息系统的恢复性调用,均为异步操作,此时各方数据会出现不同步的问题.
  • 对于复杂性,即使是只有2步,也会产生相同的情况.同样必须使用"可靠消息"系统进行保证.

原文地址:https://www.cnblogs.com/heaven-elegy/p/11691410.html

时间: 2024-09-29 05:43:00

远程调用时的分布式事物问题的相关文章

Jenkins使用jenkins-cli.jar进行远程调用时出现“ERROR: No such job 'test'”的问题解决(Windows)

网上最提倡的解决办法是用SSH的key进行登录,但是我发觉Linux上非常容易实现,但是Windows压根不知道在哪里设置. 原文:https://issues.jenkins-ci.org/browse/JENKINS-12543 国外参考:http://stackoverflow.com/questions/21609589/jenkins-cli-build-on-cloudbees-no-such-job 国内参考:http://www.lai18.com/content/6214326

JSON-RPC轻量级远程调用协议介绍及使用

JSON-RPC轻量级远程调用协议介绍及使用 目录 技术简介    1 一.JSON-RPC协议描述    1 二.JSON-RPC调用简单示例    1 2.1.服务器端Java调用示例    1 2.2.Java客户端调用示例    2 2.3.PHP客户端调用示例    2 2.3.JavaScript客户端调用示例    2 2.4.直接GET请求进行调用    2 三.JSON-RPC总结    3 参考文档    3 技术简介 json-rpc是基于json的跨语言远程调用协议,比x

Hessian怎样实现远程调用

1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持. Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实现方案,Hessian也是基于HTTP协议的,其工作原理如下: (1).客户端: a.发送远程调用请求: 客户端程序—>发送远程调用请求—>Hessian客户端拦截器—>封装远程调用请求—>Hessian代理—>通过HTTP协议发送远程请求代理到服务端. b.接收远程调用响应:

RFC远程调用

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291416.html RFC. 4 RFM限制... 4 ABAP调用RFM.. 5 远程目标系统维护SM59. 6 Connection type. 6 Technical Settings. 7 Logon/Security. 7 Sp

Spring使用Hessian实现远程调用

1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持. Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实现方案,Hessian也是基于HTTP协议的,其工作原理如下: (1).客户端: a.发送远程调用请求: 客户端程序->发送远程调用请求->Hessian客户端拦截器->封装远程调用请求->Hessian代理->通过HTTP协议发送远程请求代理到服务端. b.接收远程调用响应:

dubbo集成zookeeper rpc远程调用

注:下面使用dubbo依赖的是zookeeper注册中心,这里没有详细的介绍.在配置之前,请自行准备好zookeeper环境. 后续如果写zookeeper的配置会补放链接 添加Gradle依赖 compile group: 'com.alibaba', name: 'dubbo', version: '2.5.10'//dubbo compile group: 'org.apache.zookeeper', name: 'zookeeper', version: '3.3.3'//zookee

Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛

分布式对象和远程调用

一.引言 1.1 分布式对象技术要解决的基本问题 分布式对象技术是在面向对象技术的基础上发展起来的,它要解决的主要问题是位于不同进程中的对象之间的调用问题. 支持访问异地对象,支持访问异构对象(java平台调用C.vb,C++). 1.2 中间件 参考http://kb.cnblogs.com/page/196448/ 1.中间件是一种软件,它提供基本的通信模块和其他一些基础服务模块,使得应用程序开发提供平台. 中间件技术提供了一个编程的抽象,来屏蔽上述的异质问题. 通信协议:独立于网络底层的传

分布式服务架构之java远程调用技术浅析

分布式服务架构之java远程调用技术浅析     在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯