学习笔记-架构的演进之分布式事务-可靠消息队列-2月day15

前言

前面已经介绍过了本地事务(单个服务、单个数据源)、全局事务(单个服务、多个数据源)和共享事务(多个服务、单个数据源),接下来才是我们重点关注的对象,分布式事务(多个服务、多个数据源)。这里的“分布式”是相对于服务而言的,它特指的是多个服务同时访问多个数据源的事务处理机制,严谨地说,它更应该被称为“在分布式服务环境下的事务处理机制”。

CAP理论

CAP 理论又叫 Brewer 理论,这是加州大学伯克利分校的埃里克 · 布鲁尔(Eric Brewer)教授,在 2000 年 7 月“ACM 分布式计算原理研讨会(PODC)”上提出的一个猜想。后被数学推理所证明,CAP 理论也正式成为了分布式计算领域公认的著名定理。

CAP理论描述了一个分布式的系统中,当涉及到共享数据问题时,以下三个特性最多只能满足其中两个:

  1. 一致性(Consistency):代表在任何时刻、任何分布式节点中,我们所看到的数据都是没有矛盾的。
  2. 可用性(Availability):代表系统不间断地提供服务的能力。
  3. 分区容忍性(Partition Tolerance):代表分布式环境中,当部分节点因网络原因而彼此失联(即与其他节点形成“网络分区”)时,系统仍能正确地提供服务的能力。

CAP问题

当一个分布式系统不满足CAP理论时,会表现为以下三种典型的场景:

  1. 如果某一节点的变动信息没有及时同步给其他节点,那么当用户操作其他节点时,因为没有及时同步,此时系统会看到过时信息,从而错误地发生了原本无法进行的处理。此为一致性问题。
  2. 如果因为要把该变动信息同步给其他节点,就必须暂停当前用户所有相关的服务,直到数据同步一致后再重新恢复,那么当用户在下一次操作时,可能会因为系统暂时无法提供服务而被拒绝。此为可用性问题。
  3. 如果由于服务集群中某一部分节点,因出现网络问题,无法正常与另一部分节点交换账号变动信息,那么此时的服务集群中,无论哪一部分节点对外提供的服务,都可能是不正确的,我们需要考虑能否接受由于部分节点之间的连接中断,而影响整个集群的正确性的情况。此为分区容忍性问题。

CAP如何取舍

  1. 放弃分区容错性(CA without P)
    这意味着,我们将假设节点之间的通讯永远是可靠的。可是永远可靠的通讯在分布式系统中必定是不成立的,这不是你想不想的问题,而是网络分区现象始终会存在。
    在现实场景中,主流的 RDBMS(关系数据库管理系统)集群通常就是采用放弃分区容错性的工作模式。以 Oracle 的 RAC 集群为例,它的每一个节点都有自己的 SGA(系统全局区)、重做日志、回滚日志等,但各个节点是共享磁盘中的同一份数据文件和控制文件的,也就是说,RAC 集群是通过共享磁盘的方式来避免网络分区的出现。
  2. 放弃可用性(CP without A)
    这意味着,我们将假设一旦发生分区,节点之间的信息同步时间可以无限制地延长,那么这个问题就相当于退化到了上一讲所讨论的全局事务的场景之中,即一个系统可以使用多个数据源。我们可以通过 2PC/3PC 等手段,同时获得分区容错性和一致性。
  3. 放弃一致性(AP without C)
    这意味着,我们将假设一旦发生分区,节点之间所提供的数据可能不一致。

AP 系统目前是分布式系统设计的主流选择,大多数的 NoSQL 库和支持分布式的缓存都是 AP 系统。因为 P 是分布式网络的天然属性,你不想要也无法丢弃;而 A 通常是建设分布式的目的,如果可用性随着节点数量增加反而降低的话,很多分布式系统可能就没有存在的价值了(除非银行这些涉及到金钱交易的服务,宁可中断也不能出错)。

基于CAP理论的现实,人们重新给一致性下了定义,把前面我们在 CAP、ACID 中讨论的一致性称为“强一致性”(Strong Consistency),有时也称为“线性一致性”(Linearizability),而把牺牲了 C 的 AP 系统,又要尽可能获得正确的结果的行为,称为追求“弱一致性”。在弱一致性中,人们又总结出了一种特例,叫做“最终一致性”(Eventual Consistency)。它是指,如果数据在一段时间内没有被另外的操作所更改,那它最终将会达到与强一致性过程相同的结果,有时候面向最终一致性的算法,也被称为“乐观复制算法”。

除了本地事务、全局事务和分布式事务以外,还有一种对于不同事务的叫法,那就是针对追求 ACID 的事务,我们称之为“刚性事务”。而在接下来和下一讲中,我将要介绍的几种分布式事务的常见做法,会统称为“柔性事务”。

可靠事件队列

最终一致性的概念,是由 eBay 的系统架构师丹 · 普利切特(Dan Pritchett)在 2008 年发表于 ACM 的论文“Base: An Acid Alternative”中提出的。他总结了一种独立于 ACID 获得的强一致性之外的途径,即通过 BASE 来达成一致性目的,最终一致性就是其中的“E”。

这种靠着持续重试来保证可靠性的操作,在计算机中就非常常见,它有个专门的名字,叫做“最大努力交付”(Best-Effort Delivery),比如 TCP 协议中的可靠性保障,就属于最大努力交付。而“可靠事件队列”有一种更普通的形式,被称为“最大努力一次提交”(Best-Effort 1PC),意思就是系统会把最有可能出错的业务,以本地事务的方式完成后,通过不断重试的方式(不限于消息系统)来促使同个事务的其他关联业务完成。

此文章为2月Day15学习笔记,内容来源于极客时间《周志明的软件架构课

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值