我们都知道微服务现在很火热,那么我们将业务才开后随之而来的数据一致性问题也很棘手,这篇博客我将阐述一下我是如何通过实践加理论来完成最终一致的高可用并且讲述一下dotnetcore下的cap是如何实现的,话不多说直接上问题。

  1我们在编写代码的时候是否有过如下经历的转变:

//原先的业务
begin tranupdate table set column=x where id = y;update table2 set column = x where id = y;
commit
//进化后的业务需要调用第三方接口通知其完成方法:OtherService.Complete()
方法1:
OtherService.Complete();
begin tranupdate table set column=x where id = y;update table2 set column = x where id = y;
commit
方法2:
begin tranOtherService.Complete();update table set column=x where id = y;update table2 set column = x where id = y;
commit
方法3:
begin tranupdate table set column=x where id = y;OtherService.Complete();update table2 set column = x where id = y;
commit
方法4:
begin tranupdate table set column=x where id = y;update table2 set column = x where id = y;OtherService.Complete();
commit
方法5:
begin tranupdate table set column=x where id = y;update table2 set column = x where id = y;
commit
OtherService.Complete();

  我们可以发现业务的进化是不可阻挠的,但是如何来确保本地事务的成功外加远程调用的成功呢,首先我们排除业务逻辑上的,就是说如果不存在网络问题那么一定是会成功的只要他执行了,那么根据aop我们会发现每个方法都会有6个切面:

  谁也没法保证在哪个切面会发生网络或者断电等异常,大家可以思考一下关于上述5种方法的任何切面出现问题会有什么影响哪些切面出问题是不会有数据不一致的:

通过上面我可以看到只有4-5方法出现了一个不一致,但是方法5不排除本身调用失败,所以我们一般选择的方法4,因为在所有这么多方法中只有方法4可以称之为“伪事务”,这边可以发现只要远程调用出错那么事务会回滚可以极大的保障数据一致性,但是也不排除切面5发生错误,一旦切面5发生错误那么数据就会不一直,除非手工的去处理。有人会说了我们用mq啊,mq有特殊机制可以确定后再去除消息(rabbitmq的ack机制。)那么我们再来看下这一系列的问题。假设基于方法4的前提下将方法调用改成mq的消息机制,我们来看:

假设前面执行一切正常但是在执行ack确认完成mq清除掉消息后(channel.BasicAck(ea.DeliveryTag, false);)网络异常本地客户端没有得到正常的response那么一样等于切面4报错还是会产生消息不一致,那么说了这么多我们到底该如何才能保证消息不丢失呢。假设我们改造下mq,我先发一个消息给mq告诉他我等会会让你干什么事,如果过了多少秒我还没告诉你你来问我到底这件事还做不做了,这样我们就可以保证我们发给mq的消息不丢失,我们来看一张图

这个改进后我们发现其实还是有问题如果4-5步骤出问题了还是数据不一致,那么我们就需要再进一步改进

这样我们就可以保证消息准确无误的抵达系统B并且可以执行完成,但是这么做需要有一个强业务类型逻辑校验,保证除了网络等不可抗拒因素以外都要成功。但是有人要说了,就我们的水平不是人人都是bat里的怎么可能改进mq系统让他支持,改源码毕竟还是不太现实,那么接下来我就给大家带来2种解决方案,而且其中一种就是cap的实现。

方案1

通过代码我们可以看到利用本地数据库事务特性将要对其他系统的处理消息插入本地消息表,之后再commit之后去执行并且更新消息表,自带轮询查询消息表达到数据一致,cap就是这个方式来实现的最终一致。不过这种方法需要本地存储支持事务特性,而且并发量受本地数据库性能的限制,但是特点是实现起来简单有效方便。那么第二种方案是自己实现一个独立的可靠消息中间件。

方案2:

方案2这里要说的是系统a需要提供查询接口来供消息系统查询未处理的消息来确认是否要执行,系统b需要做的是提供查询接口来让消息系统来确认是否已经执行成功,因为消息系统在发消息给系统b的时候中间也会存在网络终端问题,而且这样一个消息系统就完全不存在事务的依赖关系,而且也不对原先的业务进行侵入,并发完全由消息系统自己独立控制。尤其是系统B和消息系统需要做好的是消息的重复消费要保证幂等的关系,所谓的幂等就是我同一个消息我执行一次和执行n次都只会成功一次,具体可以靠并发字段或者rowversion来保证,之后有时间我会单独写一个独立的消息中间件的demo,对了消息系统可以自身携带轮询系统,也可以有第三方的控制台程序或者其他定时程序来实现轮询

转载于:https://www.cnblogs.com/xuejiaming/p/9417386.html

分布式事务最终一致看这篇“大白话”的实践相关推荐

  1. 一招让你拿下seata分布式事务框架,看这篇文章准没错!

    第一阶段:架构师筑基必备技能 我觉得,但凡是个成年人应该都清楚扎实的基本功对自己的工作帮助有多重要.从各大招聘网站的招聘要求来看,第一条都明确说明需要扎实的Java基础.因此,一般笔试以及面试的第一轮 ...

  2. 分布式事务最终一致性-CAP框架轻松搞定

    前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...

  3. 一致 先验分布 后验分布_「分布式技术」分布式事务最终一致性解决方案,下篇...

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 上 ...

  4. 分布式事务最终一致性常用方案

    目前的应用系统,不管是企业级应用还是互联网应用,最终数据的一致性是每个应用系统都要面临的问题,随着分布式的逐渐普及,数据一致性更加艰难,但是也很难有银弹的解决方案,也并不是引入特定的中间件或者特定的开 ...

  5. java分布式事务——最终一致性,最大努力通知总结!

    目录 源码地址:https://github.com/kaixuanzhang123/dtx.git 4.分布式事务解决方案之可靠消息最终一致性 4.1.什么是可靠消息最终一致性事务 4.2.解决方案 ...

  6. 6种分布式事务最终一致性解决方案,一次性说清了!

    分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,尤其在微服务架构中,几乎可以说是无法避免,因此也常常被认为是微服务落地的最大阻碍. 随着系统的服务拓扑从单体应用迈 ...

  7. 阿里 P8 聊分布式事务最终一致性的 6 种解决方案

    分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,尤其在微服务架构中,几乎可以说是无法避免,因此也常常被认为是微服务落地的最大阻碍. 随着系统的服务拓扑从单体应用迈 ...

  8. 分布式事务最终一致性mysql_分布式事务最终一致性方案案例

    前言: 以下以网上课程购买流程举一个例子: 如何实现两个分布式服务(订单服务.学习服务)共同完成一件事即订单支付成功自动添加学生选课的需求, 这里的关键是如何保证两个分布式服务的事务的一致性. 订单支 ...

  9. MySQL事务基础,看这篇就够了!

    文章目录 事务简介 事务操作 事务特征(ACID) 事务安全隐患 关于MySQL的基础可以看这篇博客: 值得收藏的MySQL基础总结 事务简介 事务(Transaction) 事务是一个最小的不可再分 ...

最新文章

  1. cmd开无线服务器,使用cmd命令开启wifi
  2. Android消息机制——时钟显示和异步处理工具类(AsyncTask)
  3. AS3工程中的Loading的应用
  4. nginx 知识点 :ctx_index and index
  5. C++语法细节注意集锦
  6. golang延时_golang 实现延迟消息原理与方法
  7. 鸿蒙后的时期有什么,鸿蒙系统什么时候上市 华为鸿蒙系统有多厉害?
  8. 监督学习 | 朴素贝叶斯原理及Python实现
  9. MySQL5.7默认打开ONLY_FULL_GROUP_BY模式问题与解决方案
  10. python抢小米6自动化脚本
  11. 剖析 |数据现代化-富国银行的数据转型之路
  12. idea 搜索不到gsonformat_Android Studio 4.1没有GsonFormat插件的解决
  13. 【已解决】在Angular 中使用思源黑体
  14. yzl的VSCode使用指南
  15. 天梯赛 - 一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字
  16. [Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTPhoneticRun报错
  17. 695. 岛屿的最大面积
  18. PHP如何把word文档转换为html
  19. 山那边的panpan(序言)
  20. Downie 4 for Mac(最好用的视频下载软件)

热门文章

  1. python中case的用法_用 Python 实现简单的 switch/case 语句
  2. JUnit+EclEmma进行覆盖测试
  3. 某网站高度加密混淆的javascript的分析
  4. 西瓜书学习记录-绪论
  5. python3爬虫初探(八)requests
  6. python3爬虫初探(四)之文件保存
  7. SpringCloud实现原理图
  8. MySql+Socket 完成数据库的增查Demo
  9. 并发编程—Volatile关键字
  10. MongoDB 之 幽灵操作避免