首页 > 其他分享 >分布式事务的几种实现方式

分布式事务的几种实现方式

时间:2023-07-04 17:11:54浏览次数:64  
标签:事务 可用性 几种 消息 分布式系统 一致性 分布式

基础理论

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

分布式事务产品框架

京东jdts

服务通过lb连到集群中任何一个节点均能保证业务正确执行,某一个节点异常时集群可正常提供服务,同时支持集群横向、纵向扩展。

Seata

一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

全局事务服务GTS

用于实现分布式环境下,特别是微服务架构下的高性能事务一致性。可以与RDS、MySQL、PostgreSQL等数据源,Spring Cloud、Dubbo、HSF及其他RPC框架,MQ消息队列等中间件产品配合使用,轻松实现分布式数据库事务、多库事务、消息事务、服务链路级事务及各种组合。

作者:京东零售 谷伟

来源:京东云开发者社区

标签:事务,可用性,几种,消息,分布式系统,一致性,分布式
From: https://www.cnblogs.com/Jcloud/p/17526248.html

相关文章

  • 应用技术架构 —— 分布式应用多运行时架构
    应用技术架构——分布式应用多运行时架构发布于 2022-03-1609:25:141K0举报本文作者:何文强—CODING高级解决方案架构师具有一线互联网、物联网独角兽、全国股份制银行、新型智慧交通等跨行业从业经历,历任Java开发高级工程师、DevOps技术专家......
  • 数据库内核:PostgreSQL 事务
    事务处理事务简介事务是一个应用层面的操作,通过一系列的数据库操作执行。一个事务会影响数据库的状态。对于事务来说,会有很多限制,这些限制实质上是保障整个数据库的状态是合乎标准的,但是在执行事务期间,可能会有一部分限制被打破,但是如果该事务是合法的,那么在完成或放弃当前......
  • 分布式医疗云平台(项目功能简介截图)【
    目录3、看病就诊 3.1、门诊挂号3.2、挂号列表 3.4.我的排班 3.5.医生排班  3.6.患者库 4.收费管理4.1.处方收费  4.2.收费查询 4.3.处方退费4.4.退费查询  4.5.处方发药3、看病就诊 3.1、门诊挂号3.1.1、已存在的患者挂号3.1.2、不存在的患者挂号 直接输入患者信息 ......
  • 分布式医疗云平台(项目功能简介截图)【手机端
    目录7.手机端7.1.首页7.2.医院信息  7.3.人个中心7.手机端7.1.首页7.1.1.绑定完善个人信息 7.1.2.预约挂号 7.1.3.挂号记录 7.1.4.就诊病例7.1.5.病历详情 7.1.6.检查结果 7.1.7.检查结果详情 7.2.医院信息  7.3.人个中心7.3.1.我的档案信息 7.3.2.完善档案......
  • springboot封装redission的分布式锁逻辑为注解
    场景概述使用分布式锁的时候,每次都需要使用trycatch处理方法中的逻辑。考虑是否可以这块逻辑抽离出来。实现在自定义的注解中添加属性来设置锁的等待时间、租赁时间和时间单位importjava.lang.annotation.*;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTI......
  • 分布式id---雪花算法
    为什么要用分布式id随着业务的增长,后期可能会对数据库进行拆分的操作,通过数据库中间间链接。如果数据库表中的id采取的是自增策略,则会产生重复的id。使用分布式id便是为了避免此类现象。雪花算法snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使......
  • 入选德勤粤港澳大湾区及广州高科技高成长两大榜单,巨杉数据库引领分布式数据库弯道超车
    巨杉数据库凭借在分布式数据库领域的优异表现和突出成果,入选2022德勤粤港澳大湾区高科技高成长40强及明日之星和广州高科技高成长20强及明日之星两大榜单。近日,经德勤中国与大湾区科技创新服务中心、广东粤港澳大湾区研究院联合组织征集、评选及审定,公布了2022德勤粤港澳大湾区高......
  • SequoiaDB分布式数据库2023.6月刊
    本月看点速览全球溯源中心系列成果发布,巨杉数据库受邀出席聚焦产业升级,斩获新一代信息技术创新企业推进产业生态,赋能行业发展青杉计划2023已开启,一起攀登更高的“杉” 全球溯源中心系列成果发布,巨杉数据库受邀出席6月19日,“链接世界预鉴未来”——全球溯源中心系列......
  • 41.C++中有几种类型的new
    41.C++中有几种类型的new在C++中,new有三种典型的使用方法:plainnew,nothrownew和placementnew(1)plainnew言下之意就是普通的new,就是我们常用的new,在C++中定义如下:void*operatornew(std::size_tsize)throw(std::bad_alloc){void*ptr=std::malloc(size);......
  • 34.C++有哪几种的构造函数
    34.C++有哪几种的构造函数C++中的构造函数可以分为4类:默认构造函数:在没有显式定义构造函数时,C++会自动生成一个默认构造函数,该函数没有参数,不执行任何操作。初始化构造函数(有参数)拷贝构造函数:当使用现有对象初始化新对象时,拷贝构造函数被调用。它的语法是在函数声明时使用一......