首页 > 其他分享 >分布式解决了解

分布式解决了解

时间:2023-07-21 14:34:30浏览次数:40  
标签:事务 协调者 模式 了解 阶段 解决 参与者 分布式

一,分布式事务阐述

分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,且属于不同的应用,分布式事务需要保证这些操作要么全部成功,要么全部失败。

事务的本质就是保证不同数据库的数据一致性。

二,分布式事务通用解决方案

1,两阶段提交(2PC)

通过引入一个协调者来进行协调事务的参与者并且最终决定是否执行或回滚

(1) 准备阶段

事务参与者执行但不提交 ,协调者询问参与者是否成功,参与者发送结果

(2)提交阶段

协调者根据参与者返回的结果来判断是否进行回滚

 

2.存在缺陷

1.同步行为 效率较低 参与者在等待其他参与者返回结果期间处于阻塞状态

2.容错低 任何一个节点失败都导致回滚

3.数据不一致 协调者发送提交命令时可能网络异常导致部分参与者提交

4.协调者不能发生故障

 

2.补偿事务(TCC)

补偿机制,核心思想是对每一个操作都注册一个对应的确认和补偿操作

分为三个阶段

Try 对业务系统进行检测并预留资源

Confirm 阶段是对try阶段的确认 所以默认是try成功 confirm一定成功

Cancel 是在业务执行错误的业务取消预留资源释放

缺点:

确认和取消阶段都可能失败并且需要编写大量补偿代码

 

3本地消息表+异步确认

消息表与业务数据表存在于同一数据库中,并且使用消息队列来保证数据一致性

 

1.进行业务数据操作同时向消息表中插入一条数据,然后将本地消息表中的数据发送给消息队列,转发成功则删除,否则继续转发,另一方监听消息队列,获取消息后进行消息中的操作

 

缺点: 必须保证插入消息表成功 ,耦合性高

 

4.mq事务消息

使用支持事务的消息队列来进行

缺点:实现难度大,大部分消息队列并不支持 rocketmq事务部分代码并未开源

 

三.开源成熟的分布式组件

1.seata(阿里开源的分布式事务解决方案)

1.Seata的名词

 

 

 

2.Seata的四种模式

(1)AT模式(默认也是应用最广泛的模式)

AT模式也是两阶段提交的模式,最大的优点是无侵入

 

一阶段下解析sql,并保存该条数据为快照,执行sql并生成快照再将该条数据行锁

 

二阶段如果是提交就清楚存储的快照和行锁 如果是回滚则使用快照校验数据避免脏写后再回滚

(2)XA模式

Xa模式分为2pc和3pc两种实现方式

.两阶段

原理同上面方案一样

三阶段

原理在二阶段基础上进行了增强,将二阶段进行了拆分

 

 

阶段一:Cancommit

协调者询问参与者是否可以进行操作

阶段二:precommit

协调者向参与者发起预提交(执行事务但不提交)请求,并等待参与者进行ack返回

如果没有全部返回或某个协调者超时则返回about

阶段三:docommit

协调者向参与者发起提交事务请求并等待ack返回

 

区别

2pc只有协调者有超时时间 3pc都有

注:Seata的xa模式为了保障强一致性会加锁影响效率,所以使用不多

(2) TCC模式

Tcc理论见上面

 

Seata的tcc 比需要注意的是空回滚和防悬挂,幂等性等问题

空回滚:没有进行第一阶段而执行了第二阶段,则取消操作是无效的

防悬挂:就是预留一些资源但后续某些原因或是达到某种状态预留资源在结束并未释放导致浪费

(4)SAGA

它是一个长事务的解决方案,在saga模式中,每个流程都提交本地事务,当某一个失败则采用补偿机制补偿前面成功的事务

 

(5)应用场景
  • AT 模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。
  • TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。
  • Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保证性能,多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。
  • XA模式是分布式强一致性的解决方案,但性能低而使用较少。

 

2. ShardingSphere (开源的分布式数据库中间件解决方案组成的生态圈)

https://shardingsphere.apache.org/document/current/cn/overview/(官网)

由三部分组成

3. tcc-transaction (github开源项目)

按照tcc补偿机制开发的开源项目,自行查看学习

http://mengyun.org/zh-cn/docs/tutorial/quickstart.html (tcc-transaction官网)

https://github.com/changmingxie/tcc-transaction(官方git)

标签:事务,协调者,模式,了解,阶段,解决,参与者,分布式
From: https://www.cnblogs.com/xgphpstudy/p/17571249.html

相关文章

  • SLF4J: Class path contains multiple SLF4J bindings报错,logback-classic.jar与slf4j
    1.问题:控制台一直报错: 1SLF4J:ClasspathcontainsmultipleSLF4Jbindings.2SLF4J:Foundbindingin[jar:file:/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]3SLF4J:Foundbindingin[jar:file:/slf4j/slf4j-log......
  • API管理中的一些难点及Apipost如何解决
    API管理已经成为了现代软件开发和企业IT架构中不可或缺的一部分。随着API数量和复杂性的增加,API的管理也变成了一道难题。那么Api管理存在哪些难点及如何解决呢,看完本篇文章相信你一定有所收获。API文档管理难点API文档需要提供清晰的API功能、参数、请求和响应,以便开发人员可以......
  • 分布式架构-Redisson 框架介绍使用
    分布式架构-Redisson框架介绍使用**一、Redisson**Redisson是架设在Redis基础上的一个Java驻内存数据网格。在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。使得原本......
  • 个人随笔 —— 基于 go 语言实现的轻量化 workflow 分布式引擎插件
    背景组内有很多项目都涉及复杂的任务流场景:集群创建、删除等生命周期管理k8s资源申请销毁....这些场景都有几个共同的特点:流程耗时且步骤复杂,需要几十步操作,其中包含云资源申请、脚本执行、接口调用等,且相互存在依赖关系。任务量随着业务增长而快速迭代,比如每个集群每......
  • 电脑开机自动断电怎么解决?
    日常使用电脑的时候,万一碰到电脑刚刚开机后就自行断电的故障的时候,一旦出现电脑开机后断电的情况,让我们习惯从软件下手的同学们来说,有点无从下手,该怎么办呢?下面,小编给大家带来了电脑开机自动断电的解决图文。有些朋友在实际操作电脑过程中遇到了这样的问题,每次电脑开机后,电脑就会......
  • 解决添加到.gitignore无效
    如果将.env.development文件添加到.gitignore中,但仍然在Git提交中看到该文件被包含,可能有几个原因导致.gitignore无效:文件已经被跟踪:如果.env.development文件在之前的提交中已经被跟踪(tracked),那么将它添加到.gitignore中不会自动将其从Git版本控制中移除。你需要......
  • Scrapy 部署错误:subprocess.CalledProcessError 以及解决方案
    最近在使用Scrapy和Scrapyd时,我遇到了一个关于subprocess.CalledProcessError的问题。在这篇博文中,我将描述这个错误、找出的原因以及最后的解决方案。错误描述在使用scrapyd-deploy命令部署我的Scrapy项目时,我遇到了如下的错误:subprocess.CalledProcessError:Comma......
  • Untiy 网络编程-深入了解TCP
    1.从TCP到物理层应用层:应用层是给应用程序提供功能的。在发送{hello}的例子里面,计算机会把hello转化为二进制然后发送到传输层。传输层:在收到二进制数据后,传输层协议会对它进行一系列的加工,并提供数据流传送、可靠性校验,流量控制。又由于网络层的IP包......
  • 解决Clipse Java内存溢出问题的几种方案
    解决ClipseJava内存溢出问题的几种方案随着Java应用程序的复杂度不断提高,内存溢出成为一个常见的问题。当应用程序超出了可用内存资源时,就会发生内存溢出错误。而在ClipseJava编程开发中,也常常会遇到这样的问题。为了解决这个问题,本文将介绍一些可行的解决方案。1.增加JVM堆......
  • 在Vue3中,解决 Echart tooltip 不显示的问题
    为什么在Vue中使用ECharts时图表显示异常?Vue3,中使用reactive及ref会导致ECharts的对象实例被代理成为响应式对象,影响ECharts对内部属性的访问,可能会导致图表无法正确显示等一系列意外问题,且会由于深度监听而极大地降低图表展示性能。解决方案为:使用普通变量声明ECh......