真是绝了,做了这么多年程序员第一次搞懂微服务架构的数据一致性

本文深入探讨了微服务架构中如何处理数据一致性问题,包括2PC、TCC、Saga和可靠消息模式等分布式事务解决方案的优缺点。TCC模式允许业务层面的事务控制,降低了数据库层面的压力;Saga模式通过一系列子事务和补偿操作实现最终一致性,分为编排和编制模式;可靠消息模式利用消息中间件确保事务的最终一致性。在实际应用中,应根据业务需求和系统特性选择合适的数据一致性策略。
摘要由CSDN通过智能技术生成

微服务架构的数据一致性

微服务架构下,最好的分布式数据一致性解决方案就是尽量避免分布式事务,然而,在很多场景下,分布式事务是难以避免的。在金融、电信领域中,很多业务场景要求数据的强一致性,同时要保证服务的可扩展性和可靠性。如何保证分布式事务下的数据一致性成为微服务架构的一个重要课题和难点。

解决方案概览

在工程领域,分布式事务的讨论主要聚焦于强一致性和最终一致性的解决方案。常见的分布式事务有基于XA协议的两阶段(2PC)提交模式,以及改良版本的三阶段(3PC)提交模式。Java事务编程接口(Java Transaction API,JTA)和Java事务服务(Java TransactionService,JTS)正是基于XA协议的实现。分布式事务包括事务管理器TM(Transaction Manager)和一个或多个支持XA协议的资源管理器RM(Resource Manager)。在微服务架构下,我们倾向使用最终一致性的方案。下面将介绍2PC模式、TCC模式、Saga模式等。

● 2PC模式,分布式事务比较典型的解决方案,但是对于微服务架构而言,可能这一方案并不适用,主要原因是不同微服务可能使用的数据存储类型不同。如果使用的NoSQL不支持事务的数据库,那么事务根本无法实现2PC模式。此外,2PC模式本身也存在同步阻塞、单点故障和性能问题。

● TCC模式,相比2PC模式,具有更强的灵活性和性能优势,TCC模式本质上是基于服务层的2PC编程模式,把事务从数据库层的事务操作逻辑抽象到业务服务层,通过服务层业务逻辑实现服务的补偿模式。

● Saga模式,核心理念是将事务切分成一组依次执行的短事务,也可以理解成基于业务补偿逻辑实现分布式下的高性能分布式事务模式。较之基于单一数据库资源访问的本地事务,分布式事务的应用架构更为复杂。在不同的分布式应用架构下,实现一个分布式事务要考虑的问题并不完全一样,比如对多资源的协调、事务的跨服务传播、业务的侵入性、隔离性等,实现机制也是复杂多变的。

● 可靠消息模式的解决方案是使用消息队列进行系统间的解耦。

由上游服务发起事件,通过消息队列传递到下游服务,下游服务接收到消息后进行事件消费,最终完成业务,达到数据一致。为了解决消息队列及上下游服务的不可靠性,通常还会借助额外的事件表和定时器辅助完成数据补偿。

 两阶段提交模式

2PC(两阶段提交)

2PC是一个非常经典的强一致、中心化的通过原子提交来实现分布式事务一致性管理的协议。这里所说的中心化指协议中有两类节点:

中 心 化 协 调 者 节 点 ( Coordinator ) 和 N 个 参 与 者 节 点(Participant)。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要协调者统一掌控所有节点(又称作参与者)的操作结果,并最终指示这些节点是否要把操作结果进行真正的提交或回滚。

2PC将整个事务流程分为两个阶段:准备阶段(Prepare Phase)和提交阶段(Commit Phase)。整个事务过程由事务管理器和参与者组成,事务管理器负责决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚。大部分关系数据库,如Oracle、MySQL,都支持两阶段提交协议。下面是计算机数据库进行两阶段提交的说明。

● 准备阶段:事务管理器为每个参与者准备(Prepare)消息,每个参与者在本地执行事务,并写本地的Undo/Redo日志,此时事务没有被提交。(Undo日志记录修改的数据,用于数据回滚;Redo日志记录修改后的数据,用于提交事务后写入数据文件)。

● 提交阶段:如果事务管理器收到了参与者执行失败或者超时的消息,则直接向每个参与者发送回滚消息;否则,发送提交消息。参与者根据事务管理器的消息执行提交或者回滚操作,并释放事务处理过程中使用的锁资源。

2PC的算法思路可以概括为:参与者将操作成败的结果通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是执行提交操作还是回滚操作。两阶段提交就是分成两个阶段提交,第一阶段询问各个事务数据源是否准备好,第二阶段才真正将数据提交给事务数据源。但因为2PC协议成本比较高,又有全局锁的问题,性能会比较差。现在我们基本上不会采用这种强一致性解决方案。2PC流程如下图所示。

在2PC中,如果两阶段出现协调者和参与者都宕机的情况,则有可能出现数据不一致的问题,同时还存在着诸如同步阻塞、单点问题、脑裂等问题,所以研究者们在2PC的基础上做了改进,提出了3PC。

3PC(三阶段提交)

3PC是2PC的改进版本,流程如下图所示。

3PC要解决的最关键问题就是协调者和参与者同时宕机的问题,所以3PC将2PC的第一阶段一分为二,形成了由canCommit、preCommit和Commit 3个阶段组成的事务处理协议。

3PC的核心理念是:在询问时并不锁定资源,除非所有参与者都同意了,才开始锁资源。一旦参与者无法及时收到来自协调者的信息,它就会默认执行Commit,而不会一直持有事务资源并处于阻塞状态,但是这种机制也会导致数据一致性问题。3PC在2PC的基础上做了如下改进:

● 增加了超时机制。

● 在两阶段之间插入了准备阶段。

TCC补偿模式

关于TCC(Try-Confirm-Cancel)的概念,最早是由Pat Helland在2007年发表的一篇名为Lifebeyond Distributed Transactions:anApostate’s Opinion的论文中提出的。在该论文中,TCC还是以
Tentative-Confirmation-Cancellation命名的。

TCC的核心思想是:针对每个操作都要注册一个与其对应的确认和补偿(撤销)操作。TCC事务处理流程和2PC类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值