大家好,我是小,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。
成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的平果网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
今天,小将带大家探讨分布式事务里的“八奇技”,帮助大家在实际的分布式系统中更好地运用事务。
分布式事务是在分布式系统中,跨越多个计算机节点或数据存储系统进行的事务,在这种环境下保证事务的ACID(原子性、一致性、隔离性、持久性)属性是一大挑战。
对此,业界有以下 8 种常见的解决方案,俗称 “八奇技”。
二阶段提交协议(Two-phase commit protocol),简称 2PC。两阶段提交是一种强一致性事务协议,它分为准备阶段和提交阶段。
图片
在准备阶段,协调者节点询问所有参与者是否准备好提交事务,如果所有参与者都答应准备好了,那么在提交阶段,协调者会通知所有参与者提交事务。
如果有任何一个参与者在准备阶段没有准备好,那么协调者会通知所有参与者回滚事务。
有熟悉 MySQL 的同学可能马上想到了,MySQL 的事务提交就是通过几种日志来实现二阶段提交的。
不了解MySQL执行流程的可以看我之前写的这篇文章:一张图看懂SQL执行流程
三阶段提交协议(Three-phase commit protocol),简称 3PC。三阶段提交(3PC)是两阶段提交(2PC)的改进版本,它旨在减少在协调者和参与者之间的阻塞时间,同时增加系统在某些故障情况下的容错能力,以下是 3PC 的三个阶段:
协调者行动: 发送 CanCommit 请求到所有参与者,并等待回应。
参与者行动: 如果参与者可以提交事务,它就返回 Yes,并进入预备状态;如果不能提交,则返回 No。
协调者行动: 如果所有参与者回答 Yes,协调者发送 PreCommit 请求给所有参与者,并进入 Prepared 阶段;如果有任何参与者回答 No,或者等待超时,协调者发送 abort 请求。
参与者行动: 在收到 PreCommit 请求后,参与者会执行事务操作,写入日志,但不提交,然后响应 ACK,并等待最终指令。如果参与者在这个阶段超时没有收到协调者的消息,它将中止事务。
DoCommit 阶段
协调者行动: 一旦协调者收到所有参与者的 ACK,它会进入 DoCommit 阶段,发送 commit 请求给所有参与者。
参与者行动: 参与者在收到 commit 请求后,提交事务,释放所有事务锁定的资源,并向协调者发送完成消息。
与 2PC 相比,3PC 在 PreCommit 阶段引入了超时机制,允许参与者在没有接收到协调者的最终指令时自行决定中止事务,这减少了协调者成为单点故障的可能性。
3PC通常用于需要较高可靠性的分布式系统中,尤其是在那些不能接受长时间锁定资源的场景。例如:
虽然 3PC 提供了比 2PC 更好的容错性和减少了阻塞的时间,但它仍然有一些缺点:
因此,在实际应用中,需要权衡 3PC 带来的好处与其复杂性和性能开销之间的关系,确保它适合特定的业务场景和系统需求。
在某些情况下,其他的事务模型,如最大努力通知等最终一致性模型,可能会是更合适的选择。
TCC(Try-Confirm-Cancel)是一种应用层的分布式事务解决方案,它将事务分为三个步骤:尝试(Try)、确认(Confirm)和取消(Cancel):
图片
假设我们买一张从深圳到北京的火车票,票价为 360 元,TCC 分为这三个步骤:
TCC 的出现解决二阶段提交的几个缺点:
Saga 是一种长事务的解决方案,它将一个大的分布式事务拆分成多个较小的本地事务,这些本地事务通过异步消息传递串联起来。
每个本地事务执行成功后,会发送消息触发下一个事务的执行。如果某个本地事务失败,Saga 会执行一系列补偿操作(回滚之前的操作)来保持数据的一致性。
假设有一个旅游网站,用户可以通过它预订机票、酒店和租车服务。每个预订步骤都可以视为一个 Saga 中的小事务:
如果用户成功完成了所有预订步骤,那么整个旅行预订就完成了。但如果在预订租车服务时失败了,那么 Saga 会开始执行补偿操作:
通过这种方式,Saga 确保了用户不会因为部分服务预订失败而损失金钱或留下未处理的预订。
在选择使用 Saga 模式时,需要仔细考虑业务场景是否适合最终一致性,以及是否能够有效地实现和管理补偿逻辑。对于那些需要高度一致性保证的场景,可能需要考虑其他事务管理机制。
在某些情况下,可以使用分布式锁来确保多个分布式节点不会同时操作同一资源。这可以通过 Redis、ZooKeeper 等分布式协调服务来实现。
不知道分布式锁或者不了解如何实现的,可以看这篇文章:说出来你可能不信,分布式锁竟然这么简单...
图片
本地消息表是一种确保分布式事务最终一致性的方法。它的工作原理是:
本地消息表是 ebay 公司提出的事务解决方案,它的核心原理是将需要分布式处理的任务通过消息日志的方式来异步执行。消息日志可以存储到本地文件、数据库或消息队列,再通过业务规则或人工发起重试。
本地消息表基于 BASE 理论,实现数据的最终一致性,实现过程中需要注意幂等性原则。
通过可靠消息服务保证消息的可靠传输,并在消息消费者那里进行本地事务处理,从而实现最终一致性,所以又被称作消息事务。如果消息处理失败,可以重试或者进行人工干预。
执行流程:
如果事务执行成功,则 commit,消息中间件将消息下发至消费端
如果事务执行失败,则回滚,消息中间件将这条 prepare 消息删除
这种方案也是实现了「最终一致性」,和本地消息表类似,但是对比本地消息表实现方案,消息事务不需要再建消息表,而是将消息中间件的机制去做的,「不再依赖本地数据库事务」了。
所以这种方案更适用于高并发的场景,目前市面上实现该方案的「只有阿里的 RocketMQ」。
最大努力通知也是一种基于消息的分布式事务解决方案,但它不保证 100% 的消息传递成功。它的工作原理是:
本地消息表,或者通过 MQ 对事务进行通知都可以算作最大努力。
本地消息表通过后台定时任务去异步保证数据的一致性,就是一种最大努力通知的思想:代表系统各模块之间已经最大程度地保证事务的最终一致性了。
在选择分布式事务解决方案时,需要根据业务需求、系统复杂度、性能要求等因素进行权衡。
例如,对于业务场景要求数据的一致性非常高,且可以接受一定程度的性能损失时,2PC 或者 3PC 是很好的选择。
对于复杂业务流程中的分布式事务,需要在业务层进行更细粒度控制时,TCC 是一个好的选择。比如,用户在电商平台下单购买商品,涉及到库存、账户余额、积分等多个服务的数据变更。
而对于可容忍短时间内数据不一致的业务,则可以考虑最终一致性相关的解决方案,如:本地消息表、消息事务及最大努力通知方案等等。
因此,当我们探讨分布式事务时,不仅要把握好用户痛点和实际需求,还要结合每个分布式事务解决方案的特点,才能把 “八奇技” 用到出神入化之境。
网站题目:数据齐舞:深入浅出分布式事务的八奇技
网页网址:http://www.shufengxianlan.com/qtweb/news1/286351.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联