分布式事务(1)

2020-07-23

概念

随着互联网的发展,软件系统由原来的单体应用转变为分布式应用。
分布式事务会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间的远程协作才能完成事务操作,这种分布式系统环境下由不同服务之间通过网络远程协作完成的事务称为分布式事务,例如用户注册送积分事务,创建订单减库存事务,银行转账事务等。

分布式事务产生的场景

典型的场景就是微服务

微服务之间通过远程调用来完成事务操作。
比如:订单微服务和库存微服务,下单的同时订单微服务请求库存微服务减少库存。
简言之:跨jvm进程产生分布式事务。

单体系统访问多个数据库实例

当单体系统需要访问多个数据库(实例)时,就会产生分布式事务。
比如:用户信息和订单信息分别在两个mysql实例存储,用户管理系统删除用户信息,需要分别删除用户信息及用户的订单信息,由于数据库分布在不同的数据实例,需要通过不同的数据库连接去操作数据,此时也会产生分布式事务。
简言之:跨数据库实例产生分布式事务。

多数据访问同一个数据库实例

比如:订单微服务和库存微服务即使访问同一个数据库也会产生分布式事务,原因就是跨jvm进程,两个微服务有了不同的数据库连接进行数据库操作,此时也会产生分布式事务。

分布式事务问题:无法用本地数据库控制的事务,就是分布式事务的问题。

分布式事务的基础理论

分布式事务与本地事务不同的是,分布式事务之所以叫分布式,是因为提供服务的不同节点分布在不同的机器上,相互之间通过网络交互。不能因为有一点网络问题就导致整个系统无法提供服务,网络因素成了分布式事务的考量标准之一。因此,分布式事务需要更进一步的理论支持,接下来介绍一下分布式事务的CAP理论。

CAP理论

理解CAP

CAP是Consistency,Availability,Partition tolerance三个单词的缩写,分别表示一致性,可用性,分区容忍性。
下面分别来解释以下:
为了方便对CAP理论对理解,我们结合电商项目中对一些业务来理解CAP。
如下图:是商品信息管理的执行流程:
image.png
整体流程如下:

  1. 商品服务请求主数据库写入商品信息(添加商品,修改商品,删除商品)。
  2. 主数据库向商品服务响应写入成功。
  3. 商品服务请求从数据库读取商品信息。
C-Consistency:

一致性是指写操作后的读操作可以读到最新的数据状态,当数据分布在多个节点上,从任意的节点读取到的数据都是最新的。
上图中,商品信息的读写要满足一致性就要实现如下目标:

  1. 商品服务写入主数据库成功,则向从数据库查询新数据也成功。
  2. 商品服务写入主数据库失败,则向从数据库查询新数据也失败。
    如何实现一致性?
  • 写入主数据库后要让数据同步到从数据库。
  • 写入主数据库后,在向从数据库同步期间要将从数据库锁定,待同步完成后再释放锁,以免在新数据写入成功后,向从数据库查询到旧的数据。
    分布式系统一致性的特点:
  1. 由于存在数据同步的过程,写操作的响应会有一定的延时。
  2. 为了保证数据一致性会对资源暂时锁定,待数据同步完成释放锁定资源。
  3. 如果请求数据同步失败的节点则会返回错误信息,一定不会返回旧数据。
A-Availability

可用性指的是任何事务操作都可以得到响应结果,且不会出现响应超时或者响应错误。
上图中,商品信息读取满足可用性就是要实现如下目标:

  • 从数据库接收到数据插叙的请求则立即能够响应数据查询结果。
  • 从数据库不允许出现响应超时或者响应错误。
    如何实现可用性?
  • 写入主数据库后要让数据同步到从数据库。
  • 由于要保证从数据库的可用性,不可将从数据库的资源进行锁定。
  • 即时数据还没有同步过来,从数据库也要返回要查询的数据,哪怕是旧数据,如果连旧数据也没有则可以按照约定返回一个默认信息,但不能返回错误或者响应超时。
    分布式系统可用性的特点:
  • 所有请求都有响应,且不会出现响应超时或者响应错误。
P-Partition tolerance:

通常分布式系统的各个节点部署在不同的子网,这就是网络分区,不可避免的会出现网络问题而导致节点之间通信失败,此时仍可对外提供服务,这叫分区容忍性。
上图中,商品信息读写满足分区容忍性就是要实现如下目标:

  • 主数据库向从数据库同步数据失败不影响读写操作。
  • 其中一个节点挂掉不影响另一个节点对外提供服务。
    如何实现分区容忍性?
  • 尽量使用异步取代同步操作,例如使用异步方式将数据从主数据库同步到从数据库,这样节点之间能有效的实现松耦合。
  • 添加从数据库节点,其中一个从节点挂掉其它从节点提供服务。
    分布式分区容忍性的特点:
  • 分区容忍性是分布式系统具备的基本能力。

CAP组合方式

1,上面的商品管理的例子是否具备CAP呢?
在所有分布式场景中不会同时具备CAP三个特性,因为具备了P的前提下C和A是不能共存的
比如:下图满足了P即表示实现分区容忍性。
image.png
本图的分区容忍性的含义是:

  • 主数据库通过网络向从数据库同步数据,可以认为主从数据库部署在不同的分区,通过网络进行交互。
  • 当主数据库和从数据库之间当网络出现问题不影响主数据库和从数据库对外提供服务。
  • 其中一个节点挂掉不影响另一个节点对外提供服务。
    如果要实现C则必须保证数据一致性,在数据同步的时候为防止向从数据库查询不一致的数据则需要将从数据库锁定,待同步完成后解锁,如果同步失败从数据库要返回错误信息或超时时间。
    如果要实现A则必须保证数据可用性,不管任何时候都可以向数据库查询数据,则不会响应超时或返回错误信息,通过分析发现在满足P的前提下C和A是矛盾的。

CAP有哪些组合方式呢?

所以在生产中对分布式事务处理时要根据需求来确定满足CAP对哪两个方面。

  • AP:放弃一致性,追求分区容忍性和可用性。这是很多分布式系统设计时对选择。
  • CP:放弃可用性,追求一致性和分区容错性。
  • CA:放弃分区容错性,即不进行分区,不考虑由网络不通或节点挂掉对问题,则可以实现一致性和可用性。那么系统将不是一个标准对分布式系统,我们最常用对关系型数据库就满足了CA。

总结

通过上面对CAP理论:一个分布式系统最多同时满足一致性(Consistency),可用性(Availability)和分区容错性(Partition tolerance)这三项中对两项。它可以作为我们进行架构设计,技术选型对考量标准。
对于大多数互联网应用对场景,节点众多,部署分散,而且现在的集群规模越来越大,所以节点故障,网络故障是常态,而且要保障达到服务可用性,并要达到良好的响应性能来提高用户的体验,因此一般会作出如下选择:保证P分区容错性和A可用性,舍弃C一致性,保证最终的一致性。


标题:分布式事务(1)
作者:张范
地址:http://misterzhang.top/articles/2020/07/23/1595487773317.html