一文带你理解什么是分布式事务

前言

之前在朋友圈看到有大佬推荐《微服务架构设计模式》一书,陆陆续续花了数个月阅读完成,是一本非常值得后端开发人员阅读的书籍,里面从分布式开始,一直讲到微服务架构,分布式一致性,分布式事务,虚拟化,事件溯源开发等等,有兴趣的朋友可以买来看看。

这篇文章部分内容摘自此书的分布式事务章节,还有一些则是笔者的理解和网上搜集的方案。

在开始之前,让我们先来讲一个小故事。

在一个古老的森林里,住着各种各样的小动物。它们和谐相处,但有一天,一只叫做小松鼠的小动物,发现了一个问题。每次它们要一起策划一场大型的晚宴时,总是发生混乱,因为食材、准备工作等事务无法很好地协同。

于是,小松鼠决定召集森林里的小动物们开了一次紧急会议,讨论如何解决这个问题。在会议上,各种小动物都纷纷发言,提出了各自的建议。

小松鼠说:"我们需要一种分布式事务的思维,确保每个环节都能协同工作,以保证我们的晚宴能够成功。"

老狐狸提出:"我们可以把晚宴的筹备过程分为几个阶段,每个阶段由不同的小动物负责。这样,每个阶段就像一个事务,只有在确认完成后,才能进入下一个阶段。"

小松鼠点头称赞道:"这个主意不错,我们可以将整个筹备过程分为采购、准备、烹饪和布置等几个阶段。每个阶段由不同的小动物团队负责。"

于是,小兔子负责食材采购,小熊负责筹备工作,小狸猫负责烹饪,而小鹿负责布置现场。每个小动物团队在完成自己的任务后,都会向其他团队发送通知,表示自己的任务已经完成,可以进入下一个阶段。

这样一来,整个晚宴的筹备过程就像是一个分布式事务系统,每个小动物团队都在各自的阶段完成任务,确保了晚宴的有序进行。最终,他们成功地举办了一场美妙的晚宴,大家都非常满意。

什么是分布式事务

在当今的软件系统中,一般都是牺牲强一致性来换取系统的高性能和高可用,只需要保证数据的最终一致性,一般来说这个达到最终一致性的时间需要在用户和产品层面是可以接受的。当然有一些系统对于一致性的要求更高,比如金融系统,金融系统一般都需要保持最终结果的强一致性,不然就会发生钱凭空消失的可能。

那么在以上场景中,我们如何保证我们数据的最终一致性呢?

一般来说我们会采用分布式事务、分布式锁等方案。

分布式事务与数据库事务一样,同样具有ACID(原子、一致、隔离、持久)四个数学,最终保证的是系统状态的一致性

那么什么是分布式事务呢?

现在的业务系统一般都是微服务架构,即使不是微服务架构,那么一个系统也会有多个服务来组成。

那么业务的一个完整流程很可能就需要分别调用散落在各个节点的各个不同服务上的接口,这个时候如果我们想要保证这个完整流程的一致性,那么就需要保证请求各个节点的各个服务,要么都成功,要么都失败。

如果使用强一致性方案,基本就靠『多阶段提交』这样的方式,如果采用弱一致性方案,那么可选择的方案就比较多。

分布式事务 VS 分布式一致性协议 VS 分布式锁 VS 数据库事务

分布式一致性

分布式一致性协议针对的是多个节点重复做相同的一件事情,主要处理的是多副本之间的一致性,更像是共识算法,比如Paxos算法、ZAB算法、Raft算法、Gossip算法。分布式一致性协议需要处理的任务逻辑是:

如下图所示,服务中的每一个结点对外来说,都是相等的,n1-n5在客户端的感知中没有任何区别。

每个节点都要完成同一个任务并且保证节点之间的处理状态完全一致

分布式事务

分布式事务则针对的是几个不同的任务或流程,它们要捆绑在一起成功或者失败,要么都成功、要么都失败,要保证多个流程的一致性,针对的整体且完整流程的原子性

如下图所示,n1-n5所做的事情是不一样的,可以将它们理解成是有顺序的(向调度者请求的顺序),只有上一步完成了,做下一步才有意义。

每个节点都要完成不同任务,并且保证同时成功或者同时失败

分布式锁

分布式锁则用于解决分布式系统中多个进程(任务)之间对共享资源的竞争问题,在单机系统中可以使用锁来确保同一时刻只有一个进程可以访问共享资源;在分布式系统下则必须通过分布式锁来做到对共享资源进行同步

如图,系统中的多个结点通过分布式锁请求资源,然后才能够处理请求,作出相应,这里同时只能有N个结点拿到锁,从而拿到需要的资源,比如数据库连接等等。

每个节点都想拿到资源,但是同一时刻只能有一个节点拿到资源

分布式事务vs数据库事务

数据库事务相对来说比分布式事务会容易实现很多,数据库系统会将跨表事务的问题收拢到系统内部来处理,然后系统内部基于XA或者其他协议,结合MVCC事务锁之类的机制,就可以解决好这个问题

但是对于分布式事务而言,它涉及到的是散落在各个节点的各个服务之间的一致性,每个服务节点的数据存储机制和方案都是不固定的,因此就无法采用数据库事务的解决方案。

我们一般无法收归下游其他服务以及内部不同存储系统之间的事务。因此,针对业务层面的分布式事务的解决方案,一般的做法就是加一层或多层抽象:

● 增加外在的事务存储

● 要求事务参与方遵循某些约束,调用特定的一些API将事务信息进行上报关联

● 引入事务协调者,由它来根据参与方上报的信息做一些事务的驱动逻辑

结语

本文主要向大家介绍了什么是分布式事务,以及分布式事务和其他技术,比如分布式一致性、分布式锁等技术的区别。 创作不易,如果有收获欢迎点赞、评论、收藏,您的支持就是我最大的动力。

相关推荐
齐 飞1 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
LunarCod1 小时前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
码农派大星。2 小时前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man2 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*2 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu3 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s3 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子3 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
材料苦逼不会梦到计算机白富美3 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
想进大厂的小王3 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构