分布式事务解决方案-数据一致性问题

1.分布式事务解决方案-数据一致性问题

例如我们在扣减库存与保存订单是在两个服务中存在的,如果扣减库存后订单保存失败了是不会回 滚的,这样就会造成数据不一致的情况,这其实就是我们所说的分布式事务的问题,接下来我们来学习 分布式事务的解决方案。也就是解决数据一致性问题。

1.1 本地事务与分布式事务

1.1.1 事务

数据库事务(简称:事务,Transaction)是指数据库执行过程中的一个逻辑单位,由一个有限的数据库操 作序列构成。 事务拥有以下四个特性,习惯上被称为ACID特性

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么 都不执行。

一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。

一致状态是 指数据库中的数据应满足完整性约束。除此之外,一致性还有另外一层语义,就是事务的中间状态不能 被观察到(这层语义也有说应该属于原子性)。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行,如同只有这一个 操作在被数据库所执行一样。

持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。在事务结束时,此操 作将不可逆转。

1.1.2 本地事务

起初,事务仅限于对单一数据库资源的访问控制,架构服务化以后,事务的概念延伸到了服务中。倘若将 一个单一的服务操作作为一个事务,那么整个服务操作只能涉及一个单一的数据库资源,这类基于单个服 务单一数据库资源访问的事务,被称为本地事务(Local Transaction)。

image-20220729211835429

分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系 统的不同节点之上,且属于不同的应用,分布式事务需要保证这些操作要么全部成功,要么全部失败。本 质上来说,分布式事务就是为了保证不同数据库的数据一致性。 最早的分布式事务应用架构很简单,不涉及服务间的访问调用,仅仅是服务内操作涉及到对多个数据库 资源的访问。

image-20220729212036752如果一个

​ 服务操作需要调用另外一个服务,这时的事务就需要跨越多个服务 了。在这种情况下,起始于某个服务的事务在调用另外一个服务的时候,需要以某种机制流转到另外一 个服务,从而使被调用的服务访问的资源也自动加入到该事务当中来。

image-20220729212153762

这两种场景(一个服务可以调用多个数据库资源,也可以调用其他服务)结合在一起,对此进 行延伸,整个分布式事务的参与者将会组成如下图所示的树形拓扑结构。在一个跨服务的分布式事务 中,事务的发起者和提交均系同一个,它可以是整个调用的客户端,也可以是客户端最先调用的那个服 务。

image-20220729212301137

较之基于单一数据库资源访问的本地事务,分布式事务的应用架构更为复杂。在不同的分布式应用架构 下,实现一个分布式事务要考虑的问题并不完全一样,比如对多资源的协调、事务的跨服务传播等,实 现机制也是复杂多变。

1.2 分布式事务相关理论

1.2.1 CAP定理

image-20220729212858388

CAP定理是在 1998年加州大学的计算机科学家 Eric Brewer (埃里克.布鲁尔)提出,分布式系统有三 个指标

Consistency 一致性

Availability 可用性

Partition tolerance 分区容错性

它们的第一个字母分别是 C、A、P。Eric Brewer 说,这三个指标不可能同时做到。这个结论就叫做 CAP 定理。

分区容错 Partition tolerance

image-20220729213000971

上图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时 候,必须考虑到这种情况。 一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。

可用性 Availability Availability

中文叫做”可用性”,意思是只要收到用户的请求,服务器就必须给出回应。 用户可以选择向 G1 或 G2 发起读操作。不管是哪台服务器,只要收到请求,就必须告诉用户,到底是 v0 还是 v1,否则就不满足可用性。

image-20220729213124317

一致性 Consistency Consistency

中文叫做”一致性”。意思是,写操作之后的读操作,必须返回该值。 举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。

image-20220729213214167

问题是,用户有可能向 G2 发起读操作,由于 G2 的值没有发生变化,因此返回的是 v0。G1 和 G2 读 操作的结果不一致,这就不满足一致性了。

image-20220729213343383

为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。

image-20220729213504075

一致性和可用性的矛盾

如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才 能重新开放读写。锁定期间,G2 不能读写,没有可用性。 如果保证 G2 的可用性,那么势必不能锁定 G2,所以一致性不成立。 综上所述,G2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么 无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。

1.2.2 BASE理论

BASE:全称:Basically Available(基本可用),Soft state(软状态),和 Eventually consistent(最终一 致性)三个短语的缩写,来自 ebay 的架构师提出。BASE 理论是对 CAP 中一致性和可用性权衡的结 果,其来源于对大型互联网分布式实践的总结,是基于 CAP 定理逐步演化而来的。其核心思想是:

既是无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用 适当的方式来使系统达到最终一致性(Eventual consistency)。

Basically Available(基本可用)

什么是基本可用呢?假设系统,出现了不可预知的故障,但还是能用,相比较正常的系统而言:

  1. 响应时间上的损失:正常情况下的搜索引擎 0.5 秒即返回给用户结果,而基本可用的搜索引擎可以 在 1 秒作用返回结果。

  2. 功能上的损失:在一个电商网站上,正常情况下,用户可以顺利完成每一笔订单,但是到了大促期 间,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面

Soft state(软状态)

什么是软状态呢?相对于原子性而言,要求多个节点的数据副本都是一致的,这是一种 “硬状态”。 软状态指的是:允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统 在多个不同节点的数据副本存在数据延时

Eventually consistent(最终一致性)

系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端 对系统的数据访问最终都能够获取到最新的值。

1.3 分布式事务解决方案

1.3.1 基于XA协议的两阶段提交 2PC

首先我们来简要看下分布式事务处理的XA规范 :

image-20220729215148623

可知XA规范中分布式事务有AP,RM,TM组成: 其中

应用程序(Application Program ,简称AP):AP定义事务边界(定义事务开始和结束)并访问事务 边界内的资源。

资源管理器(Resource Manager,简称RM):Rm管理计算机共享的资源,许多软件都可以去访问这些 资源,资源包含比如数据库、文件系统、打印机服务器等。

事务管理器(Transaction Manager ,简称TM):负责管理全局事务,分配事务唯一标识,监控事务的执 行进度,并负责事务的提交、回滚、失败恢复等。

二阶段协议:

第一阶段TM要求所有的RM准备提交对应的事务分支,询问RM是否有能力保证成功的提交事务分支, RM根据自己的情况,如果判断自己进行的工作可以被提交,那就对工作内容进行持久化,并给TM回执 OK;否者给TM的回执NO。RM在发送了否定答复并回滚了已经完成的工作后,就可以丢弃这个事务分 支信息了。

第二阶段TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare 成功,那么TM通知所有的RM进行提交;如果有RM prepare回执NO的话,则TM通知所有RM回滚自己 的事务分支

也就是TM与RM之间是通过两阶段提 交协议进行交互的.

优点: 尽量保证了数据的强一致,适合对数据强一致要求很高的关键领域。(其实也不能100%保证强 一致)

缺点: 实现复杂,牺牲了可用性,对性能影响较大,不适合高并发高性能场景。

1.3.2 TCC补偿机制

TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿 (撤销)操作。它分为三个阶段:

Try 阶段主要是对业务系统做检测及资源预留

Confirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。

Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。


分布式事务解决方案-数据一致性问题
https://1902756969.github.io/Hexo/2022/09/21/微服务/分布式事务解决方案/
作者
发布于
2022年9月21日
许可协议