一次讲清楚,七种分布式事务的解决方案

论坛 期权论坛     
选择匿名的用户   2021-5-23 02:00   17   0
<div id="js_content">
<p style="text-align: center"><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-4c752c7c5ef394d02ce54d494e49a50f.gif"></p>
<p style="text-align: center"><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-c8c764025cc437c1b5507c1a34b34159.png"></p>
<p style="text-align: right">来源 | moon聊技术</p>
<p style="text-align: right">责编 | 寇雪芹</p>
<p style="text-align: right">头图 | 下载于视觉中国</p>
<h1><br></h1>
<h1><br></h1>
<h1><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9994a276465d262f2e2d1d0ac670cddb.png"></h1>
<h1><strong>什么是分布式事务</strong></h1>
<p>分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器「分别位于不同的分布式系统的不同节点之上」。一个大的操作由N多的小的操作共同完成。而这些小的操作又分布在不同的服务上。针对于这些操作,「要么全部成功执行,要么全部不执行」。</p>
<p><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-0c95882f6a92709b15df34bfc8f60aba.png"></p>
<h1><strong>为什么会有分布式事务?</strong></h1>
<p>举个例子:</p>
<p><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-a38a8e2166c16218ee3ed26f034e25ca.png"></p>
<p>转账是最经典的分布式事务场景,假设用户 A 使用银行 app 发起一笔跨行转账给用户 B,银行系统首先扣掉用户 A 的钱,然后增加用户 B 账户中的余额。<br></p>
<p>如果其中某个步骤失败,此时就有可能会出现 2 种「异常」情况:</p>
<ul><li><p>1.用户 A 的账户扣款成功,用户 B 账户余额增加失败<br></p></li><li><p>2.用户 A 账户扣款失败,用户 B 账户余额增加成功。</p></li></ul>
<p>对于银行系统来说,以上 2 种情况都是「不允许发生」,此时就需要事务来保证转账操作的成功。</p>
<p>在「单体应用」中,我们只需要贴上&#64;Transactional注解就可以开启事务来保证整个操作的「原子性」。</p>
<p>但是看似以上简单的操作,在实际的应用架构中,不可能是单体的服务,我们会把这一系列操作交给「N个服务」去完成,也就是拆分成为「分布式微服务架构」。</p>
<img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-72529addfdb677e07513b23a3aff0e3d.png">
<p>比如下订单服务,扣库存服务等等,必须要「保证不同服务状态结果的一致性」,于是就出现了分布式事务。</p>
<p><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-d1933b4caa84776c3c7f8828d19c302a.png"></p>
<h1><strong>分布式理论</strong></h1>
<h2><strong> </strong><strong> CAP定理</strong></h2>
<p>在一个分布式系统中,以下三点特性无法同时满足,「鱼与熊掌不可兼得」</p>
<blockquote>
  <p>一致性(C):<br>在分布式系统中的所有数据备份,「在同一时刻是否拥有同样的值」。(等同于所有节点访问同一份最新的数据副本)</p>
</blockquote>
<blockquote>
  <p>可用性(A):<br>在集群中一部分节点「故障」后,集群整体「是否还能响应」客户端的读写请求。(对数据更新具备高可用性)</p>
</blockquote>
<blockquote>
  <p>分区容错性(P):<br>即使出现「单个组件无法可用,操作依然可以完成」。</p>
</blockquote>
<p>具体地讲在分布式系统中,在任何数据库设计中,一个Web应用「至多只能同时支持上面的两个属性」。显然,任何横向扩展策略都要依赖于数据分区。因此,设计人员必须在一致性与可用性之间做出选择。</p>
<h2><strong> </strong><strong> BASE理论</strong></h2>
<p>在分布式系统中,我们往往追求的是可用性,它的重要程序比一致性要高,那么如何实现高可用性呢?</p>
<p>前人已经给我们提出来了另外一个理论,就是BASE理论,它是用来对CAP定理进行进一步扩充的。BASE理论指的是:</p>
<ul><li><p>「Basically Available(基本可用)」</p></li><li><p>「Soft state(软状态)」</p></li><li><p>「Eventually consistent(最终一致性)」</p></li></ul>
<p>BASE理论是对CAP中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。</p>
<p><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-13fdb1f39c8ef9af63d1eb22286cbd9b.png"></p>
<h1><strong>分布式事务解决方案</strong></h1>
<h2>  两阶段提交(2PC)</h2>
<p>熟悉mysql的同学对两阶段提交应该颇为熟悉,mysql的事务就是通过「日志系统」来完成两阶段提交的。</p>
<p>两阶段协议
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP