读书笔记--分布式架构的异步化和缓存技术原理及应用场景
本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事务来解决,但是对于分布式架构下的应用系统来说,事务性问题就无法采用这种方式了,否则会出现数据库单点问题,而且随着应用范围和用户量的增大,需要通过分布式异步化机制来解决系统处理性能和吞吐率下降等问题,以及各大平台的直播促销活动带来的瞬时流量等问题。本文介绍的柔性事务、两阶段/三阶段提交、消息服务实现分布式事务处理、缓存技术支撑各种大促秒杀场景的稳定、可靠的实施,那分布式架构下的事务性问题该如何解决呢?如何借助缓存技术来支撑目前比较流行的秒杀活动、抖音直播促销活动等。
一、分布式事务相关的几个业务概念术语
1.事务和柔性事务
传统的事务主要通过数据库事务来保证业务的一致性,核心就是实现了ACID(原子性、一致性、隔离性和持久性),表示一个事务包含的所有逻辑处理都作用于数据库上,只有这个事务的所有操作都成功,才会永久更新到数据库,任何一个操作失败,对数据库修改都会失效。
柔性事务是在互联网场景或分布式领域提出的,主要有两个理论:CAP和BASE,CAP理论认为一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)中的其中两项。BASE是CAP理论的延伸,包括基本可用(Basically Available)、柔性状态(Soft State)和最终一致性(Eventual Consistency),允许一定时间内不同节点的数据不一致,但要求实现数据的最终一致机制,目的是为了实现较高的可用性,因此,高可用=系统构建在多机=分布式系统,高性能=分布式系统的副产品。
2.业务流程异步化
企业在做共享服务平台建设过程中,各个业务平台不断建设沉淀并提供一些可共享给外部的专业服务,这些服务组合起来就是一个或一类业务场景,但这些服务之间不可能都顺序同步执行,很多服务都是异步调用方式,而且同步执行将导致调用时间比较长影响用户体验,同时长时间占用资源导致系统的吞吐量下降。因此就需要将业务流程中的各个业务逻辑通过异步化方式进行并行处理,相当于同步执行的异步化处理,这样既降低了处理时间,也提升了吞吐量和并发处理效率,目前主要通过消息队列来实现。比如网上订单交易业务流程包括订单交易开始、库存检查、库存预减、订单生成、支付生成等,其中的订单生成通过消息中间件服务可拆分为订单日志、支付生成等。
3.数据库事务异步化
核心就是将大事务拆分为小事务,降低数据库资源的长时间占用导致的数据库瓶颈,最终提升系统的吞吐量和事务操作响应时间。比如还款业务流程拆分为还款开始、还款计算、还款计划分派、还款计划处理和详单处理等。
4.柔性事务中的两阶段提交(2PC)和三阶段提交(3PC)
在分布式系统中,用户在下单时,需要同时创建订单信息和减库存的操作,然而创建订单信息和减库存是分布在不同服务器和不同数据库中的,这种情况下只能借助分布式事务介入,保证所有操作,要么一起提交,要么一起回滚,如下图所示。
两阶段提交(2PC,2 Phase Commit):一种分布式事务协议,确保所有参与者在提交或回滚事务时都处于一致的状态。
1)准备阶段(prepare phase):在这个阶段,事务协调者(Transaction Coordinator)向所有参与者(Transaction Participant)发出准备请求,询问它们是否准备好提交事务。参与者执行所有必要的操作,并回复协调者是否准备好提交事务。如果所有参与者都回复准备好提交事务,协调者将进入下一个阶段。如果任何参与者不能准备好提交事务,协调者将通知所有参与者回滚事务。
2)提交阶段(commit phase):在这个阶段,如果所有参与者都已准备好提交事务,则协调者向所有参与者发送提交请求。参与者执行所有必要的操作,并将其结果记录在持久性存储中。一旦所有参与者都已提交事务,协调者将向它们发送确认请求。如果任何参与者未能提交事务,则协调者将通知所有参与者回滚事务。
两阶段提交面临的问题:
2PC 协议可确保分布式事务的原子性和一致性,但是其效率较低,可能会出现阻塞等问题。
1)同步阻塞问题:执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。也就是说从投票阶段到提交阶段完成这段时间,资源是被锁住的。
2)单点故障:由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。
3)数据不一致问题:在 2PC 最后提交阶段中,当协调者向参与者发送 commit 请求之后,发生了局部网络异常或者在发送 commit 请求过程中协调者发生了故障,这会导致只有一部分参与者接受到了 commit 请求。而在这部分参与者接到 commit 请求之后就会执行 commit 操作。但是其他部分未接到 commit 请求的机器则无法执行事务提交,于是整个分布式系统便出现了数据不一致性的现象。
三阶段提交(3PC,3 Phase Commit):3PC是在 2PC 协议的基础上添加了一个额外的阶段来解决 2PC 协议可能出现的阻塞问题。
1)CanCommit 阶段(询问阶段):在这个阶段,事务协调者(Transaction Coordinator)向所有参与者(Transaction Participant)发出 CanCommit 请求,询问它们是否准备好提交事务。参与者执行所有必要的操作,并回复协调者它们是否可以提交事务。
2)PreCommit 阶段(准备阶段):如果所有参与者都回复可以提交事务,则协调者将向所有参与者发送PreCommit 请求,通知它们准备提交事务。参与者执行所有必要的操作,并回复协调者它们是否已经准备好提交事务。
3)DoCommit 阶段(提交阶段):如果所有参与者都已经准备好提交事务,则协调者将向所有参与者发送DoCommit 请求,通知它们提交事务。参与者执行所有必要的操作,并将其结果记录在持久性存储中。一旦所有参与者都已提交事务,协调者将向它们发送确认请求。如果任何参与者未能提交事务,则协调者将通知所有参与者回滚事务。
3PC相较于2PC的优点:
3PC引入了超时机制,同时在协调者和参与者中都引入超时机制(2PC 只有协调者有超时机制);
3PC 相比于 2PC 增加了 CanCommit 阶段,可以尽早的发现问题,从而避免了后续的阻塞和无效操作,3PC 协议能够更快地执行提交或回滚事务。也就是说,3PC 相比于 2PC,因为引入了超时机制,所以发生阻塞的几率变小了;同时 3PC 把之前 2PC 的准备阶段一分为二,变成了两步,这样就多了一个缓冲阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。
5.数据一致性问题和解决方案
3PC 虽然可以减少同步阻塞问题和单点故障问题,但依然存在数据一致性问题(概率很小),而解决数据一致性问题的方案有很多,常见的有Paxos算法或柔性事物机制等。
1)Paxos 算法:Paxos 算法是一种基于消息传递的分布式一致性算法。
Paxos 算法是一种分布式共识算法,用于在分布式系统中实现数据的一致性和共识,保证分布式系统中不同节点之间的数据同步和一致性。 Paxos 算法由三个角色组成:提议者、接受者和学习者。当一个节点需要发起一个提议时,它会向其他节点发送一个提议,接受者会接收到这个提议,并对其进行处理,可能会拒绝提议,也可能会接受提议。如果有足够多的节点接受了该提议,那么提议就会被确定下来,并且通知给所有学习者,最终所有节点都会达成共识。
2)柔性事务:允许一定时间内不同节点的数据不一致,但要求最终一致的机制。柔性事物有 TCC 补偿事物、可靠消息事物(MQ 事物)等。比如阿里的支付宝XTS框架、TXC事务等。
二、柔性事务如何解决分布式事务问题
1.日志补偿机制:类似于传统的数据库,原子性主要通过日志保证,事务日志记录了参与者信息、开始和结束状态等,参与者需要根据重做或回滚REDO/UNDO日志,实现数据恢复到一致状态,根据事务的当前执行状态,重试异常步骤或回滚前序步骤。
2.可靠消息传递:在分布式环境下,节点之间的消息传递有成功、失败和不知道成功还是失败三种状态,这种情况下一般采取消息至少投递一次,但可能投递多次,可能存在网络通信危险期(比如收不到回应的原因是请求没有成功发送到服务器,服务器处理完成后的回应无法传回请求方)。
3.实现无锁机制:解决性能瓶颈和吞吐率问题是采取无锁机制实现事务隔离,主要有避免事务进入回滚、辅助业务变化明细表而不直接对原始数据库进行修改操作(只有用户付款成功采取更新库存数据等)和乐观锁(通过数据版本号方式实现数据更新操作,只有版本号一致才做更新操作等),乐观锁需要在应用中实现,需要所有应用都实现数据的存储逻辑机制,一般的数据应用的共享服务中心层统一实现。
三、阿里实现的柔性事务解决方案有哪些?
1.消息分布式事务:通过异步消息队列方式实现分布式事务,大大提升了整个业务处理的吞吐率和响应时间,这些异步消息同样起到检查点作用,比如互联网订单交易流程可以从下单开始拆分为库存、支付宝、交易等,但这种方式只能让开发人员全面了解业务并通过正向补偿来实现。
2.支付宝XTS框架:基于BASE实现两阶段提交分布式事务,保证分布式环境下的高可用和数据一致性要求,支持事务的正向和反向补偿,这种方案需要开发人员根据该框架,负责实现XTS提供的接口,以实现XTS框架对事务参与者的事务协调和控制,包括TCC阶段,具体如下。
Try:主要对系统进行检测及资源预留
Confirm:主要对业务系统做确认提交,默认Confirm阶段不会出错,只有Try成功,Confirm一定成功。
Cancel:主要在业务执行错误时需要回滚的状态下,执行业务取消,预留资源释放等。
3.TXC架构事务服务:同样基于BASE实现两阶段提交分布式事务,全面支持分布式数据库事务、多库事务、消息事务、服务链路调用事务基各种组合场景下的事务,包括事务协调者(TXC Server)、事务发起者(Client)、事务提供者()、资源管理器(Resource Manger)等。
四、缓存技术及应用场景
缓存是另一项实现系统更好处理性能和更高吞吐率的技术,我们知道内存操作时间是纳秒级、SSD硬盘操作时间是微妙级,随着业务范围和用户量的增大,缓存技术或平台在业务场景中越来越重要的角色,核心缓存产品有阿里的Tair,开源的Redis等。
1.小库存商品的秒杀场景:类似于双11秒杀购物节,这种场景需要实现商品的定时上架、商品色瞬时售空等,需要通过库存的乐观锁实现库存数量的更新操作,一般通过缓存服务器缓存商品的基本信息,只有在最终下单后才需要对数据库进行库存更新访问操作。
2.大库存商品的大促场景:类似于小库存商品描述场景,需要缓存商品的基本信息,同时将订单交易创建环节中对原本商品数据库的库存信息操作替换为对缓存服务中运行,实现纳秒级的数据更新处理。