首页 > 编程语言 >JAVA微服务分布式事务的几种实现方式

JAVA微服务分布式事务的几种实现方式

时间:2023-07-05 17:12:52浏览次数:43  
标签:事务 JAVA 可用性 几种 分布式系统 一致性 超时 数据 分布式

基础理论

CAP理论

一致性(Consistency) :在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误;
可用性(Availability):在集群中一部分节点故障,也能保证客户端访问系统并得到正确响应,允许一定时间内数据状态不一致;
分区容错性(Partition tolerance):分布式系统在遇到任何网络分区故障时,仍然能保证对外提供满足一致性和可用性的服务,除非整个网络环境都发生故障;

本地事务四大特性(ACID)

事务应该是具备原子性一致性隔离性和持久性,简称 ACID。
原子性(Atomicity) ,可以理解为一个事务内的所有操作要么都执行,要么都不执行。
**一致性(Consistency) **,可以理解为数据是满足完整性约束的,也就是不会存在中间状态的数据,事务前后数据的完整性必须保持一致。。
隔离性(Isolation) ,指的是多个事务并发执行的时候不会互相干扰,即一个事务内部的数据对于其他事务来说是隔离的。
持久性(Durability) ,指的是一个事务完成了之后数据就被永远保存下来,之后的其他操作或故障都不会对事务的结果产生影响。

BASE理论

基本可用(Basically Available):分布式系统在出现故障时,保证核心可用,允许损失部分可用性。(响应时间上的损失、功能上的损失)
软状态(Soft State):系统中的数据允许存在中间状态,中间状态不影响系统的整体可用性。(支付中、处理中等)
最终一致性(Eventually Consistent):系统中的数据不可一直处于软状态,必须在有时间期限,在期限过后应当保证数据的一致性。(支付中变为支付成功)
相比于本地事务的ADIC强一致性模型,BASE理论提出通过牺牲一定的强一致性来获得可用性;
不同业务单元和业务组件对数据一致性的要求不一样,因此分布式系统中BASE理论和ACID特性会结合使用。

幂等性设计

幂等(Idempotent)是一个数学与计算机学中的概念。f(n) = 1^n , 无论n等于多少,f(n)永远值等于1;
在程序中,使用相同参数执行同一个方法,每一次执行结果都是相同的,即具有幂等性;
以订单状态处理为例的幂等性设计,不论执行多少次orderProcess()方法,都只会扣减一次库存,并且返回true。

分布式事务分类

二段提交2PC(Two-Phase-Commit)|三段提交3PC (Three-Phase-Commit)


三阶段提交引入两个机制
1、 引入超时机制。同时在协调者和参与者中都引入超时机制。
2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
主要解决的问题:
避免了参与者在长时间无法与协调者节点通讯(协调者挂掉了)的情况下,无法释放资源的问题,因为参与者自身拥有超时机制会在超时后,自动进行本地commit从而进行释放资源。而这种机制也侧面降低了整个事务的阻塞时间和范围。
缺点:
性能较差,会存在长时间的锁表。

补偿事务-TCC(Try-Confirm-Cancel)|Saga


TCC 与Saga其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。确认和补偿都有采用幂等性设计。

缺点:代码量大,可维护性差。

消息事务


消息一致性方案是通过消息中间件保证上、下游应用数据操作的一致性。基本思路是将本地操作和发送消息放在一个事务中,保证本地操作和消息发送要么两者都成功或者都失败。下游应用向消息系统订阅该消息,收到消息后执行相应操作。
消息方案从本质上讲是将分布式事务转换为两个本地事务,然后依靠下游业务的重试机制达到最终一致性。
代表产品:RocketMQ

标签:事务,JAVA,可用性,几种,分布式系统,一致性,超时,数据,分布式
From: https://www.cnblogs.com/ncyy/p/17529022.html

相关文章

  • 并发扣减库存不使用分布式锁用幂等性怎么实现
    扣减库存接口/***Notes:修改或删除库存信息复核提交,移位完成,调拨完成后触发*原始库位扣减操作*User:sl*Date:2023-04-1117:31*@param$data*@param$type1,复核完成2调拨出库完成后扣减3,源库位移位完成后*移位......
  • 浅谈java8中map的新方法
    Map在java8中新增了两个replace的方法1.replace(k,v)在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值(新值)在指定的键不存在时,方法会return回来一个nulljavadoc的注释解释了该默认值方法的实现的等价Java代码:if(map.containsKey(key)){returnmap.put(ke......
  • 金九银十跳槽涨薪Java面试题!568页真题+答案解析,大厂都在考
    2023年一半又过去了,各大企业的招聘也又开始大量放岗了,各位苟着的小伙伴们要抓住机会了! 但很多小伙伴对面试不够了解,不知道如何准备,对面试环节的设置以及目的不了解,尤其是面试题还很难,有些还偏重实战,因此成功率不高。要知道目前校招生面试的成功率低于1%,而社招的面试成功率也......
  • Java面向对象
    Java面向对象什么是面向对象1.面向过程步骤简单清晰2.面向对象分类的思维模式适合处理复杂的问题3.oop以类的方式组织代码,以对象的组织(封装)数据4.特点:抽象5.特性:封装、继承、多台回归方法的定义和调用1.方法的定义1.return代表方法结束了......
  • HDFS集群搭建:完全分布式
    主要区别一就是各个角色在哪儿启动,完全分布式也就是各个角色分布在不通的节点上1、基础环境:部署配置NN:core-site.xmlDN:workers:node01SNN:hdfs-site.xmldfs.namenode.secondary.http.addressnode01:500902、角色启动时细节配置:dfs.namenode.name.dirdfs.datanode.data.......
  • JavaWeb知识
    day01-XML&tomcatXML介绍XML:eXtendsiblemarkuplanguage可扩展的标记语言XML有什么用?1.可以用来保存数据2.可以用来做配置文件3.数据传输载体定义XML其实就是一个文件,文件的后缀为.xml文档声明简单声明:version:解析这个xml的时候,使用什么版本的解析器解析<?xmlversi......
  • JAVA 调试高内存占用与CPU满载异常场景
    高内存占用,堆溢出,OOM代码: @RequestMapping(value="/oom",method={RequestMethod.GET}) publicResultBasegetMessage2()throwsInterruptedException{ List<String>strList=Lists.newArrayList(); for(inti=0;i<10240;i++){ strLi......
  • java常见面试题分析及答案
    new一个object对象占多少字节对象头加实例数据16个字节java反射的优缺点Java反射的优点1.增加程序的灵活性,避免将程序写死到代码里2.代码简洁,提高代码的复用率,外部调用方便3.对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法Java反射......
  • Java批量操作Excel文件实践
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言|问题背景在操作Excel的场景中,通常会有一些针对Excel的批量操作,批量的意思一般有两种:对批量的Excel文件进行操作。如导入多个Excel......
  • JavaScript
    JS变量//varletconstvar:很少使用,全局作用域let:值可以被修改const:值不能被修改,而且需要在声明时初始化数值console.log('helloworld') //这是我的第一个js代码;letbbb//声明bbb=30//赋值bbb=31//修改console.log(bbb)......