事务原理:ACID,CAP和BASE理论及分布式事务一致性案例

分布式事务一致性解决方案:从理论到企业级落地实践 摘要: 分布式事务是分布式架构的核心挑战,DORA数据显示其导致的故障占比达35%。本文从CAP定理与BASE理论出发,系统对比刚性事务(2PC/3PC)与柔性事务(TCC/SAGA/本地消息表等)的优缺点及适用场景,提出电商下单场景的SAGA+事务消息混合方案,强调幂等性、重试策略与监控追溯。未来趋势包括云原生协同、标准化协议及AI驱动的自愈能力。核心在于根据业务需求权衡一致性级别,结合技术方案、规范与运维实现稳定运行。 阅读详情

分布式系统一致性的需求

需求定义

  • Safety
    Only a value that has been proposed may be chosen.
    Only a single value is chosen.
    A node never learns that a value has been chosen unless it actually has been.
  • Liveness
    Some proposed value is eventually chosen.
    If a value has been chosen, a node can eventually learn the value.

为什么安全性和活性是一致性算法的需求呢?
因为一致性和活性是所有分布式算法正确性的的等价描述。LESLIE LAMPORT在其1977年的论文《Proving the Correctness of Multiprocess Programs》中第一次描述了安全性和活性,后来成为构建分布式系统的标准。
Correctness == Safety and liveness

Safety的通俗理解是:没有坏的事情发生。同时出现两个方向的红灯或绿灯。如果车钥匙扭到点火的位置,车子必须启动。程序能够运行。钟表能够滴答。如果一个用户发出访问临界区的请求,那么必须被通过。
Liveness的通俗理解:美好的事情最终会发生。红灯最终会变绿。如果车钥匙扭到点火的位置,车子最终将会启动。程序最终将会终止。钟表会无限滴答。如果一个用户发出访问临界区的请求,那么最终请求会被通过。

存在的问题

在这样的分布式系统中进程实体和通信信道都可能发生故障。

  • 遗漏故障
    进程遗漏故障
    迄今为止,除了超时机制外,未见更加有效的进程故障判断方法。在异步系统中,超时只能表明没有响应,其原因肯那个是崩溃了,也可以是消息还没有到达。

  • 通信遗漏故障
    通信的故障发生在三个区域:发送方的缓冲区,通信信道和接收方的缓冲区。

  • 拜占庭故障
    这是可能出现的最坏的故障,此时可能发生任何类型错误,包括假冒的节点或者是被黑客攻陷的节点等。关于这个问题,Leslie Lamport在《The Byzantine Generals Problem》第一次描述了这个问题

分布式系统的复制技术

基于所有的分布式系统书籍都会提到复制技术以及它的两个需求:性能和高可用性。也就是说,通过使用复制技术,可以提供就近的数据访问和故障时的切换。当然,复制也是产生一致性问题的根源。

复制的三种模型
1.Transactional replication. 事物复制
2.State machine replication. 状态机复制状态机复制通常是由一个复制日志组成的Paxos算法实现多轮.
3.Virtual synchrony.

文件系统的复制技术:
一般有文件复制和分块复制。

数据库系统复制:
语句复制

binlog复制

2PC和3PC

工程实践上根据具体的业务场景,或保证强一致(safety),或在节点宕机、网络分化的时候保证可用(liveness)。2PC、3PC是相对简单的解决一致性问题的协议,下面我们就来了解2PC和3PC。

2PC

2PC(tow phase commit)两阶段提交[5]顾名思义它分成两个阶段,先由一方进行提议(propose)并收集其他节点的反馈(vote),再根据反馈决定提交(commit)或中止(abort)事务。我们将提议的节点称为协调者(coordinator),其他参与决议节点称为参与者(participants, 或cohorts):
这里写图片描述
在阶段1中,coordinator发起一个提议,分别问询各participant是否接受。
在阶段2中,coordinator根据participant的反馈,提交或中止事务,如果participant全部同意则提交,只要有一个participant不同意就中止。

在异步环境(asynchronous)并且没有节点宕机(fail-stop)的模型下,2PC可以满足全认同、值合法、可结束,是解决一致性问题的一种协议。但如果再加上节点宕机(fail-recover)的考虑,2PC是否还能解决一致性问题呢?

coordinator如果在发起提议后宕机,那么participant将进入阻塞(block)状态、一直等待coordinator回应以完成该次决议。这时需要另一角色把系统从不可结束的状态中带出来,我们把新增的这一角色叫协调者备份(coordinator watchdog)。coordinator宕机一定时间后,watchdog接替原coordinator工作,通过问询(query) 各participant的状态,决定阶段2是提交还是中止。这也要求 coordinator/participant 记录(logging)历史状态,以备coordinator宕机后watchdog对participant查询、coordinator宕机恢复后重新找回状态。

从coordinator接收到一次事务请求、发起提议到事务完成,经过2PC协议后增加了2次RTT(propose+commit),带来的时延(latency)增加相对较少。

3PC

3PC(three phase commit)即三阶段提交[6][7],既然2PC可以在异步网络+节点宕机恢复的模型下实现一致性

在2PC中一个participant的状态只有它自己和coordinator知晓,假如coordinator提议后自身宕机,在watchdog启用前一个participant又宕机,其他participant就会进入既不能回滚、又不能强制commit的阻塞状态,直到participant宕机恢复。这引出两个疑问:

能不能去掉阻塞,使系统可以在commit/abort前回滚(rollback)到决议发起前的初始状态
当次决议中,participant间能不能相互知道对方的状态,又或者participant间根本不依赖对方的状态

相比2PC,3PC增加了一个准备提交(prepare to commit)阶段来解决以上问题:
这里写图片描述
coordinator接收完participant的反馈(vote)之后,进入阶段2,给各个participant发送准备提交(prepare to commit)指令。participant接到准备提交指令后可以锁资源,但要求相关操作必须可回滚。coordinator接收完确认(ACK)后进入阶段3、进行commit/abort,3PC的阶段3与2PC的阶段2无异。协调者备份(coordinator watchdog)、状态记录(logging)同样应用在3PC。

participant如果在不同阶段宕机,我们来看看3PC如何应对:

阶段1: coordinator或watchdog未收到宕机participant的vote,直接中止事务;宕机的participant恢复后,读取logging发现未发出赞成vote,自行中止该次事务
阶段2: coordinator未收到宕机participant的precommit ACK,但因为之前已经收到了宕机participant的赞成反馈(不然也不会进入到阶段2),coordinator进行commit;watchdog可以通过问询其他participant获得这些信息,过程同理;宕机的participant恢复后发现收到precommit或已经发出赞成vote,则自行commit该次事务
阶段3: 即便coordinator或watchdog未收到宕机participant的commit ACK,也结束该次事务;宕机的participant恢复后发现收到commit或者precommit,也将自行commit该次事务
因为有了准备提交(prepare to commit)阶段,3PC的事务处理延时也增加了1个RTT,变为3个RTT(propose+precommit+commit),但是它防止participant宕机后整个系统进入阻塞态,增强了系统的可用性,对一些现实业务场景是非常值得的。

基础理论

先简单介绍下数据一致性的基础理论。

  • 强一致
    当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。

  • 弱一致性
    系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。

  • 最终一致性
    弱一致性的特定形式。系统保证在没有后续更新的前提下,系统能最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。

ACID模型

ACID是传统数据库常用的设计理念,追求强一致性模型。
关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区:
Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。
Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。
Isolation隔离层. 事务将假定只有它自己在操作数据库,彼此不知晓。
Durability. 一旦事务完成,就不能返回。

ACID模型要求一个事物必须满足上面的四点,这是对关系型传统数据库的指导性依据。而非关系型数据库NoSql则不再依赖这一模型。

CAP理论

2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。

CAP理论为:
一个分布式系统最多只能同时满足

  • Consistency(一致性), 数据一致更新,所有数据变动都是同步的
  • Availability(可用性), 好的响应性能
  • Partition tolerance(分区容错性) 可靠性

这三项中的两项。

BASE理论

BASE:Basically,Available,Soft state,Eventually consistent四个词组的首字母,它的意思是:基本可用+软状态+最终一致性
eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。

BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。

  • 基本可用(Basically Available)
    基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
    电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

  • 软状态( Soft State)
    软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

  • 最终一致性( Eventual Consistency)
    最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

BASE模型是传统ACID模型的反面,不同与ACID,BASE强调牺牲高一致性,从而获得可用性,数据允许在一段时间内的不一致,只要保证最终一致就可以了。

BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性: Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库) Soft state软状态 状态可以有一段时间不同步,异步。 Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时一致。

BASE思想的主要实现有
1.按功能划分数据库
2.sharding碎片

BASE思想主要强调基本的可用性,如果你需要高可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。

现在NoSQL运动丰富了拓展了BASE思想,可按照具体情况定制特别方案,比如忽视一致性,获得高可用性等等,NOSQL应该有下面两个流派:
1. Key-Value存储,如Amaze Dynamo等,可根据CAP三原则灵活选择不同倾向的数据库产品。
2. 领域模型 + 分布式缓存 + 存储 (Qi4j和NoSQL运动),可根据CAP三原则结合自己项目定制灵活的分布式方案,难度高。

这两者共同点:都是关系数据库SQL以外的可选方案,逻辑随着数据分布,任何模型都可以自己持久化,将数据处理和数据存储分离,将读和写分离,存储可以是异步或同步,取决于对一致性的要求程度。

不同点:NOSQL之类的Key-Value存储产品是和关系数据库头碰头的产品BOX,可以适合非Java如PHP RUBY等领域,是一种可以拿来就用的产品,而领域模型 +分布式缓存 + 存储是一种复杂的架构解决方案,不是产品,但这种方式更灵活,更应该是架构师必须掌握的。

分布式事务的一致性处理方案

一致性问题
一致性可分为强一致性和弱一致性,弱一致性又称为最终一致性。

使用消息队列

在单机环境中,强一致性可以由数据库的事务保证。但在多机环境中,强一致性就很难做到。尽管可以使用2PC来实现分布式事务(例如使用消息队列MQ),但它的低性能(很多情况下满足不了可用性需求)使得不适合于互联网应用。这种强一致性效果的取得,其实是让提交处理过程同步化。

主从复制

在多机环境中,通过使提交处理半同步半异步、或者全异步,取得最终一致性效果。例如数据库中的主从复制,在提交时就是主库同步从库异步,这对从库复制进度落后不多的场景很简单有效,但在从库落后主库很多时,如果应用还从从库读数据,就会读出脏数据,可以通过监控从库复制进度来选择读哪个从库以避免这个问题。在NOSQL模式下,以Dynamo为例,可以通过确定NRW的不同取值,可以做到同步、半同步半异步、或者全异步的效果。

最终一致性使得数据的提交效果具有延时性,而在一定的延时性范围内(比如1秒以内),应用的可用性就是OK的,比如提交后在客户端通过JS等停一段时间刷新页面就是要取得这种效果。

特点:

有点是:实现简单,适合于提交压力不会使得从库复制明显落后的场景。
缺点是,当主从提交压力增大、或者存在耗时长的提交命令时,从库复制进度会明显落后于主库

分布式事务一致性案例

在工程实践上,为了保障系统的可用性,互联网系统大多将强一致性需求转换成最终一致性的需求,并通过系统执行幂等性的保证,保证数据的最终一致性。但在电商等场景中,对于数据一致性的解决方法和常见的互联网系统(如 MySQL 主从同步)又有一定区别,群友的讨论分成以下 6 种解决方案。

规避分布式事务——业务整合

业务整合方案主要采用将接口整合到本地执行的方法。拿问题场景来说,则可以将服务 A、B、C 整合为一个服务 D 业务,这个服务 D 再通过转换为本地事务的方式,比如服务 D 包含本地服务和服务 E,而服务 E 是本地服务 A ~ C 的整合。

优点:解决(规避)了分布式事务。

缺点:显而易见,把本来规划拆分好的业务,又耦合到了一起,业务职责不清晰,不利于维护。

由于这个方法存在明显缺点,通常不建议使用。

经典方案 - eBay 模式

此方案的核心是将需要分布式处理的任务通过消息日志的方式来异步执行。消息日志可以存储到本地文本、数据库或消息队列,再通过业务规则自动或人工发起重试。人工重试更多的是应用于支付场景,通过对账系统对事后问题的处理。

消息日志方案的核心是保证服务接口的幂等性。

考虑到网络通讯失败、数据丢包等原因,如果接口不能保证幂等性,数据的唯一性将很难保证。

eBay 方式的主要思路如下。
Base:一种 Acid 的替代方案

此方案是 eBay 的架构师 Dan Pritchett 在 2008 年发表给 ACM 的文章,是一篇解释 BASE 原则,或者说最终一致性的经典文章。文中讨论了 BASE 与 ACID 原则在保证数据一致性的基本差异。

如果 ACID 为分区的数据库提供一致性的选择,那么如何实现可用性呢?答案是

BASE (basically available, soft state, eventually consistent)

BASE 的可用性是通过支持局部故障而不是系统全局故障来实现的。下面是一个简单的例子:如果将用户分区在 5 个数据库服务器上,BASE 设计鼓励类似的处理方式,一个用户数据库的故障只影响这台特定主机那 20% 的用户。这里不涉及任何魔法,不过它确实可以带来更高的可感知的系统可用性。

文章中描述了一个最常见的场景,如果产生了一笔交易,需要在交易表增加记录,同时还要修改用户表的金额。这两个表属于不同的远程服务,所以就涉及到分布式事务一致性的问题。

这里写图片描述

文中提出了一个经典的解决方法,将主要修改操作以及更新用户表的消息放在一个本地事务来完成。同时为了避免重复消费用户表消息带来的问题,达到多次重试的幂等性,增加一个更新记录表 updates_applied 来记录已经处理过的消息。

这里写图片描述

系统的执行伪代码如下

这里写图片描述
基于以上方法,在第一阶段,通过本地的数据库的事务保障,增加了 transaction 表及消息队列 。

在第二阶段,分别读出消息队列(但不删除),通过判断更新记录表 updates_applied 来检测相关记录是否被执行,未被执行的记录会修改 user 表,然后增加一条操作记录到 updates_applied,事务执行成功之后再删除队列。

通过以上方法,达到了分布式系统的最终一致性。进一步了解 eBay 的方案可以参考文末链接。

去哪儿网分布式事务方案

随着业务规模不断地扩大,电商网站一般都要面临拆分之路。就是将原来一个单体应用拆分成多个不同职责的子系统。比如以前可能将面向用户、客户和运营的功能都放在一个系统里,现在拆分为订单中心、代理商管理、运营系统、报价中心、库存管理等多个子系统。

拆分首先要面临的是什么呢?

最开始的单体应用所有功能都在一起,存储也在一起。比如运营要取消某个订单,那直接去更新订单表状态,然后更新库存表就 ok 了。因为是单体应用,库在一起,这些都可以在一个事务里,由关系数据库来保证一致性。

但拆分之后就不同了,不同的子系统都有自己的存储。比如订单中心就只管理自己的订单库,而库存管理也有自己的库。那么运营系统取消订单的时候就是通过接口调用等方式来调用订单中心和库存管理的服务了,而不是直接去操作库。这就涉及一个『分布式事务』的问题。

分布式事务有两种解决方式

  1. 优先使用异步消息。

上文已经说过,使用异步消息 Consumer 端需要实现幂等。

幂等有两种方式,一种方式是业务逻辑保证幂等。比如接到支付成功的消息订单状态变成支付完成,如果当前状态是支付完成,则再收到一个支付成功的消息则说明消息重复了,直接作为消息成功处理。

另外一种方式如果业务逻辑无法保证幂等,则要增加一个去重表或者类似的实现。对于 producer 端在业务数据库的同实例上放一个消息库,发消息和业务操作在同一个本地事务里。发消息的时候消息并不立即发出,而是向消息库插入一条消息记录,然后在事务提交的时候再异步将消息发出,发送消息如果成功则将消息库里的消息删除,如果遇到消息队列服务异常或网络问题,消息没有成功发出那么消息就留在这里了,会有另外一个服务不断地将这些消息扫出重新发送。

  1. 有的业务不适合异步消息的方式,事务的各个参与方都需要同步的得到结果。这种情况的实现方式其实和上面类似,每个参与方的本地业务库的同实例上面放一个事务记录库。

比如 A 同步调用 B,C。A 本地事务成功的时候更新本地事务记录状态,B 和 C 同样。如果有一次 A 调用 B 失败了,这个失败可能是 B 真的失败了,也可能是调用超时,实际 B 成功。则由一个中心服务对比三方的事务记录表,做一个最终决定。假设现在三方的事务记录是 A 成功,B 失败,C 成功。那么最终决定有两种方式,根据具体场景:

重试 B,直到 B 成功,事务记录表里记录了各项调用参数等信息;

执行 A 和 B 的补偿操作(一种可行的补偿方式是回滚)。

对 b 场景做一个特殊说明:比如 B 是扣库存服务,在第一次调用的时候因为某种原因失败了,但是重试的时候库存已经变为 0,无法重试成功,这个时候只有回滚 A 和 C 了。

那么可能有人觉得在业务库的同实例里放消息库或事务记录库,会对业务侵入,业务还要关心这个库,是否一个合理的设计?

实际上可以依靠运维的手段来简化开发的侵入,我们的方法是让 DBA 在公司所有 MySQL 实例上预初始化这个库,通过框架层(消息的客户端或事务 RPC 框架)透明的在背后操作这个库,业务开发人员只需要关心自己的业务逻辑,不需要直接访问这个库。

总结起来,其实两种方式的根本原理是类似的,也就是将分布式事务转换为多个本地事务,然后依靠重试等方式达到最终一致性。

蘑菇街交易创建过程中的分布式一致性方案

交易创建的一般性流程

我们把交易创建流程抽象出一系列可扩展的功能点,每个功能点都可以有多个实现(具体的实现之间有组合/互斥关系)。把各个功能点按照一定流程串起来,就完成了交易创建的过程。

这里写图片描述

面临的问题

每个功能点的实现都可能会依赖外部服务。那么如何保证各个服务之间的数据是一致的呢?比如锁定优惠券服务调用超时了,不能确定到底有没有锁券成功,该如何处理?再比如锁券成功了,但是扣减库存失败了,该如何处理?

方案选型

服务依赖过多,会带来管理复杂性增加和稳定性风险增大的问题。试想如果我们强依赖 10 个服务,9 个都执行成功了,最后一个执行失败了,那么是不是前面 9 个都要回滚掉?这个成本还是非常高的。

所以在拆分大的流程为多个小的本地事务的前提下,对于非实时、非强一致性的关联业务写入,在本地事务执行成功后,我们选择发消息通知、关联事务异步化执行的方案。

消息通知往往不能保证 100% 成功;且消息通知后,接收方业务是否能执行成功还是未知数。前者问题可以通过重试解决;后者可以选用事务消息来保证。

但是事务消息框架本身会给业务代码带来侵入性和复杂性,所以我们选择基于 DB 事件变化通知到 MQ 的方式做系统间解耦,通过订阅方消费 MQ 消息时的 ACK 机制,保证消息一定消费成功,达到最终一致性。由于消息可能会被重发,消息订阅方业务逻辑处理要做好幂等保证。

所以目前只剩下需要实时同步做、有强一致性要求的业务场景了。在交易创建过程中,锁券和扣减库存是这样的两个典型场景。

要保证多个系统间数据一致,乍一看,必须要引入分布式事务框架才能解决。但引入非常重的类似二阶段提交分布式事务框架会带来复杂性的急剧上升;在电商领域,绝对的强一致是过于理想化的,我们可以选择准实时的最终一致性。

我们在交易创建流程中,首先创建一个不可见订单,然后在同步调用锁券和扣减库存时,针对调用异常(失败或者超时),发出废单消息到MQ。如果消息发送失败,本地会做时间阶梯式的异步重试;优惠券系统和库存系统收到消息后,会进行判断是否需要做业务回滚,这样就准实时地保证了多个本地事务的最终一致性。

这里写图片描述

支付宝及蚂蚁金融云的分布式服务 DTS 方案

业界常用的还有支付宝的一种 xts 方案,由支付宝在 2PC 的基础上改进而来。主要思路如下,大部分信息引用自官方网站。

分布式事务服务简介

分布式事务服务 (Distributed Transaction Service, DTS) 是一个分布式事务框架,用来保障在大规模分布式环境下事务的最终一致性。DTS 从架构上分为 xts-client 和 xts-server 两部分,前者是一个嵌入客户端应用的 JAR 包,主要负责事务数据的写入和处理;后者是一个独立的系统,主要负责异常事务的恢复。

核心特性

传统关系型数据库的事务模型必须遵守 ACID 原则。在单数据库模式下,ACID 模型能有效保障数据的完整性,但是在大规模分布式环境下,一个业务往往会跨越多个数据库,如何保证这多个数据库之间的数据一致性,需要其他行之有效的策略。在 JavaEE 规范中使用 2PC (2 Phase Commit, 两阶段提交) 来处理跨 DB 环境下的事务问题,但是 2PC 是反可伸缩模式,也就是说,在事务处理过程中,参与者需要一直持有资源直到整个分布式事务结束。这样,当业务规模达到千万级以上时,2PC 的局限性就越来越明显,系统可伸缩性会变得很差。基于此,我们采用 BASE 的思想实现了一套类似 2PC 的分布式事务方案,这就是 DTS。DTS在充分保障分布式环境下高可用性、高可靠性的同时兼顾数据一致性的要求,其最大的特点是保证数据最终一致 (Eventually consistent)。

简单的说,DTS 框架有如下特性:

最终一致:事务处理过程中,会有短暂不一致的情况,但通过恢复系统,可以让事务的数据达到最终一致的目标。

协议简单:DTS 定义了类似 2PC 的标准两阶段接口,业务系统只需要实现对应的接口就可以使用 DTS 的事务功能。

与 RPC 服务协议无关:在 SOA 架构下,一个或多个 DB 操作往往被包装成一个一个的 Service,Service 与 Service 之间通过 RPC 协议通信。DTS 框架构建在 SOA 架构上,与底层协议无关。

与底层事务实现无关: DTS 是一个抽象的基于 Service 层的概念,与底层事务实现无关,也就是说在 DTS 的范围内,无论是关系型数据库 MySQL,Oracle,还是 KV 存储 MemCache,或者列存数据库 HBase,只要将对其的操作包装成 DTS 的参与者,就可以接入到 DTS 事务范围内。

以下是分布式事务框架的流程图

这里写图片描述

实现

一个完整的业务活动由一个主业务服务与若干从业务服务组成。

主业务服务负责发起并完成整个业务活动。

从业务服务提供 TCC 型业务操作。

业务活动管理器控制业务活动的一致性,它登记业务活动中的操作,并在活动提交时确认所有的两阶段事务的 confirm 操作,在业务活动取消时调用所有两阶段事务的 cancel 操作。”

与 2PC 协议比较

没有单独的 Prepare 阶段,降低协议成本

系统故障容忍度高,恢复简单

  1. 农信网数据一致性方案

  2. 电商业务

公司的支付部门,通过接入其它第三方支付系统来提供支付服务给业务部门,支付服务是一个基于 Dubbo 的 RPC 服务。

对于业务部门来说,电商部门的订单支付,需要调用

支付平台的支付接口来处理订单;

同时需要调用积分中心的接口,按照业务规则,给用户增加积分。

从业务规则上需要同时保证业务数据的实时性和一致性,也就是支付成功必须加积分。

我们采用的方式是同步调用,首先处理本地事务业务。考虑到积分业务比较单一且业务影响低于支付,由积分平台提供增加与回撤接口。

具体的流程是先调用积分平台增加用户积分,再调用支付平台进行支付处理,如果处理失败,catch 方法调用积分平台的回撤方法,将本次处理的积分订单回撤。
这里写图片描述

  1. 用户信息变更

公司的用户信息,统一由用户中心维护,而用户信息的变更需要同步给各业务子系统,业务子系统再根据变更内容,处理各自业务。用户中心作为 MQ 的 producer,添加通知给 MQ。APP Server 订阅该消息,同步本地数据信息,再处理相关业务比如 APP 退出下线等。

我们采用异步消息通知机制,目前主要使用 ActiveMQ,基于 Virtual Topic 的订阅方式,保证单个业务集群订阅的单次消费。
总结

分布式服务对衍生的配套系统要求比较多,特别是我们基于消息、日志的最终一致性方案,需要考虑消息的积压、消费情况、监控、报警等。

参考资料

Base: An Acid Alternative (eBay 方案)

In partitioned databases, trading some consistency for availability can lead to dramatic improvements in scalability.

http://queue.acm.org/detail.cfm?id=1394128 英文版

http://article.yeeyan.org/view/167444/125572 中文版

分布式事务服务 (DTS)

https://www.cloud.alipay.com/docs/middleware/xts/index.html

【分布式事务】一、分布式事务概念、解决方案,一文彻底搞懂分布式事务 【分布式事务】分布式事务概念、解决方案,一文彻底搞懂分布式事务 阅读详情

相关推荐

java面试:分布式事务理论基础(CAP原理、BASE理论、本地事务)

即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。需要操作的资源位于多个资源服务器上,而应用需要保证对于多个资源服务器的数据的操作,要么全部成功,要么全部失败。牺牲一致性而换取高可用性(最终一致性),考虑到客户体验,这个最终一致的时间窗口,尽可能的对用户透明,也就是需要保障“用户感知到的一致性”。任何事务机制在实现时,都应该考虑事务的ACID特性,包括:本地事务、分布式事务,及时不能都很好的满足,也要考虑支持到什么程度。不足之处则在于对应用的侵入性非常强。

专注于计算机研发知识和资讯分享 938

分布式BASE理论:数据一致性模型!

你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草来源:http://tinyurl.com/y8btadm3推荐:htt...

xmt1139057136的专栏 7483

Mac新手必看:为什么你的终端找不到Python命令?5分钟搞定zsh报错

本文针对Mac用户在终端遇到“zsh: command not found: python”报错的问题,提供了深度解析与实战修复指南。文章解释了macOS系统因历史原因默认使用`python3`而非`python`命令,并详细介绍了四种解决方案:养成使用`python3`的习惯、创建别名、通过Homebrew安装链接以及修改PATH环境变量,帮助新手快速解决zsh报错,顺利开始Python开发。

weixin_29248653的博客 594

BASE 理论

BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。BASE 理论是对 CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于 CAP 定理逐步演化而来的,它大大降低了对系统的要求。 BASE 理论的核心思想: 即使无法做到强...

happyJared 1671

redhawk-sc(seascape)学习日志2

design view是主view,是所有seascape view中最root的部分,一个design view可以驱动多种类型分析比如静态IR drop,动态IR drop以及EM.这些分析可以在不同的PVT和翻转率下.Design view是一个必须的view对于redhawk中的任何类型分析来说。seascape view相当于一个容器,用于保存各种和设计相关的数据,类似于逻辑信息、物理信息等等,每个view都有其对应的输入件和依赖,这些view都是redhawk用于各种类型的分析所需。

qq_39493558的博客 3497

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2905

分布式理论 - BASE理论

BASE理论与分布式事务设计摘要 BASE理论是分布式系统设计的核心原则,包含三要素:基本可用(系统故障时保证核心功能)、软状态(允许数据短暂不一致)和最终一致性(确保数据最终同步)。该理论是对CAP定理中AP系统的补充,通过牺牲强一致性换取高可用性,适用于电商大促、社交网络等场景。在微服务架构中,可通过事件驱动、Saga模式等实现跨服务最终一致性事务,典型案例如DynamoDB、Cassandra等系统。BASE理论的优势在于高可用和可扩展性,但也带来数据短暂不一致等挑战,需结合业务场景权衡设计。

csdn_tom_168的博客 1405

CAN-do-paser:Java开发的CAN总线数据帧解析库

CAN总线数据帧使用DBC文件信息解析为物理量,基于Java开发的数据解析工具。

佳瑞的博客 1133

分布式——BASE理论

BASE 理论是对 CAP 理论的一种延伸和补充,它是基于 Basically Available(基本可用)、Soft state(软状态)和 Eventually Consistent(最终一致性)这三个特性来描述分布式系统的。 BASE 理论面向的是大型高可用可扩展的分布式系统,和传统事务的 ACID 是相反的,它完全不同于 ACID 的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间是不一致的。

qq_62097431的博客 1804

Arduino开发实例-EMG 肌肉信号传感器

在医学研究中,测量肌肉的活动、收缩和扩张非常重要。 EMG 肌肉传感器测量肌肉活动并产生信号以显示扩张和收缩量。 因此,输出取决于所选肌肉的活动量。 3 绿色、红色和黄色电极连接到模块,用于传输来自肌肉运动的电信号。

视觉与物联智能 1693

抓包工具:Fiddler下载、安装、使用 教程

文章目录抓包工具:Fiddler下载、安装、使用 教程一、Fiddler 下载二、Fiddler 安装三、Fiddler 使用3、Statistics 请求的性能数据分析4、Inspectors 查看数据内容5、AutoResponder 允许拦截指定规则的请求6、Composer 自定义请求发送服务器7、Filters 请求过滤规则8、Timeline 请求响应时间9、Fiddler 设置解密HTTPS的网络数据10、Fiddler 内置命令与断点 抓包工具:Fiddler下载、安装、使用 教程 Fidd

Sumarua的博客 17万+

BASE理论(基本可用策略+ 最终一致性实现)

目录实现基本可用的几个策略1、流量削峰(不同地区售票时间错峰出售)2、延迟响应,异步处理(买票排队,基于队列先收到用户买票请求,排队异步处理,延迟响应)3、体验降级(看到非实时数据,采用缓存数据提供服务)4、过载保护熔断/限流,直接拒绝掉一部分请求,或者当请求队列满了,移除一部分请求,保证整体系统可用)5、 故障隔离(出现故障,做到故障隔离,避免影响其他服务)6.、弹性扩容(基于Metric和Monitor实现系统态势感知,做到弹性伸缩)实现最终一致性的具体方式1、读时修复2、写时修复3、异步修复使用BA.

hanhan的博客 4509

Java 实现 MP3 音频合并工具类:摆脱 FFmpeg,高效低 CPU 的纯本地方案【需求已解决】

本方案充分发挥了 Java 音频 SPI 的潜力,实现了轻量、跨平台、低 CPU 消耗的 MP3 音频合并工具类。 对于希望在服务器或桌面应用中集成音频处理功能的开发者而言,这无疑是一个可行且优雅的解决方案。

一键难忘的博客 542

关于分布式事务-小米的这篇比我自己写的强多了

分布式事务,这一篇就够了 [作者简介]李文华,小米信息技术部海外商城组 随着互联网技术的不断发展,系统越来越复杂,几乎所有 IT 公司的系统都已经完成从单体架构到分布式架构的转变,分布式系统几乎无处不在。谈到分布式系统,特别是微服务架构,我们不得不谈分布式事务。今天就跟大家一起聊聊分布式事务以及常用解决方案。 基础理论 在讲解具体方案之前,我们有必要了解一些分布式事务所涉及到的基础理论知识。 事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.

Angus 589

PreScan快速入门到精通第二十一讲驾驶员模型之驾驶员在环

请注意,操纵杆的输出角度是以度为单位的,而方向盘执行器希望其输入是以弧度为单位的。当选择一个支持的方向盘时,PreScan会自动将按钮映射到正确的功能上(如换挡),并设置轴的正确范围(如转向角度)。该系统中的所有其他组件都是为了提供正确的按钮映射,并为所选的方向盘设置正确的范围。对于每一个额外连接的控制器,它们的ID会增加一个,例如第二个控制器的设备ID为1,第三个控制器的设备ID为2,等等。由于所有的方向盘最初放在编译表上的设备ID都是0,所以用户应该先进行正确的调整,将每个控制器设置为正确的设备ID。.

小明师兄的博客 1423

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

跨行转账失败背后的分布式事务原理与实战

分布式事务是保障跨服务、跨数据库操作数据一致性的核心技术,其本质是在网络分区不可避免的前提下,通过协议设计在一致性、可用性与性能之间寻求工程平衡。它源于本地事务ACID特性的失效场景——当转账等业务逻辑需跨越银行、支付、账务等多个独立系统时,单库事务的原子性无法覆盖物理隔离的资源。主流方案如XA(强一致但低效)、TCC(高侵入但可控)、消息队列+本地事务(高可用+最终一致)及Saga(长流程补偿),分别适配不同业务SLA。本文以真实跨行转账失败与冲正过程为线索,解析prepare/commit机制、幂等设计

didi9310的博客 511

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

从 0 到 1 吃透 Java 分布式事务:Seata/TCC/ 本地消息表的终极选型指南

分布式事务解决方案对比:本地消息表、TCC模式与Seata 本文深入分析了三种主流分布式事务解决方案的特点和适用场景: 本地消息表 特点:基于最终一致性原理,通过消息队列实现 优点:实现简单、可靠性高、兼容性好 缺点:强依赖消息队列、数据库负担重 适用场景:电商下单、物流跟踪等异步流程 TCC模式 特点:Try-Confirm-Cancel三阶段事务 优点:性能高、灵活性好、一致性保证强 缺点:开发成本高、业务侵入性强

果酱 の 博客 1201

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

分布式事务原理深度解析

本文深入解析分布式事务原理,涵盖基础概念、CAP/BASE理论,以及两种主流解决方案。2PC通过协调者分两阶段控制事务提交/回滚,保证强一致性但存在同步阻塞和单点故障问题;TCC模式将事务分解为Try-Confirm-Cancel三个阶段,通过业务改造实现最终一致性,需关注幂等性和防悬挂控制。文章通过流程图和时序图详细展示各方案工作机制,为分布式系统设计提供理论指导和实践参考。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 3720

分布式事务--Seata

分布式事务--Seata

忆~遂愿的博客 2478

分布式事务:CAP理论详细介绍及发展历史

Eric Brewer是CAP理论和BASE之父。ACID及限制在数据库事务的ACID(原子性、一致性、隔离性和持久性)四大特性确保了单个数据库内部事务处理的可靠性,但在分布式系统环境下,由于网络延迟、节点故障以及数据复制等因素,ACID特性无法直接应用于跨多个数据库或服务的分布式事务。传统的ACID模型在分布式场景下可能导致性能下降或者可用性的损失。Eric Brewer提出了CAP定理,表明在分布式系统中不可能同时满足一致性(C)、可用性(A)和分区容错性(P)这三个要求,在设计时必须有所取舍。

ycsdn10的博客 1279

事务 跨库事务 分布式事务及解决方案

目录 什么是事务? 本地事务 事务传播行为: 事务的四大特性 ACID 并发事务产生的问题可以分为4类 事务的隔离级别 什么是分布式事务 分布式涉及到的原理: CAP原理: BASE理论 柔性事务和刚性事务 柔性事务分为: 分布式一致性协议 XA接口 Jta规范 两阶段提交协议 2PC 三阶段提交协议 3PC XA与TCC 的比较: 分布式事务解决...

sh_c1314 1万+

基于LCN彻底解决分布式事务

一 . 理论知识 1.数据库管理系统中事务(transaction)的四个特性:简称ACID(这种特性简称刚性事物) 原子性(Atomicity) 原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。 一致性(Consistency)一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏;这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致...

AkiraNicky的博客 1万+

Seata-Server分布式事务原理加源码(一) - 微服务之分布式事务原理

基础概念:事务ACID• A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失 败的情况。• C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转100元, 转账前和转账后的数据是正确状态这叫一致性,如果出现张三转出100元,李四账户没有增加100元这就出现了数 据错误,就没有达到一致性。

持续学习,持续更新 1418

《分布式事务理论基础:CAP定理 & BASE理论》

学习目标。

weixin_53622554的博客 1105

本地事务与分布式事务

介绍本地式和分布式事务,CAP定理和BASE理论

m0_62946761的博客 1757

深入剖析分布式事务的Java实现:从理论到Seata实战

Servicetry {// 业务流程step1();step2();step3();// 自定义回滚前处理// 继续抛出异常触发Seata回滚throw e;// 发送消息通知// 记录异常日志// 更新状态等@Bean.description("活跃全局事务数").description("失败事务数")通过本文的详细探讨,我们深入了解了分布式事务的挑战和解决方案。

2302_81153890的博客 1077
上一篇: 帮你深入理解 JAVA 对象创建的过程
下一篇: RabbitMQ安装
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值