面试题答案
一键面试Saga模式
原理
- 定义:Saga模式将一个长事务分解为多个本地短事务,每个本地事务都是一个可补偿的操作。这些本地事务按顺序执行,如果其中任何一个事务失败,Saga会执行已执行事务的补偿操作,以撤销之前的影响,保证数据一致性。
- 执行流程:例如有一个涉及订单服务、库存服务和支付服务的业务流程。当创建订单时,订单服务首先创建订单记录,接着库存服务扣减库存,最后支付服务进行支付。如果库存扣减失败,订单服务会执行撤销订单的补偿操作。Saga可以通过事件驱动或编排式来协调这些本地事务。事件驱动方式下,每个本地事务完成后发布事件,后续事务监听事件触发执行;编排式则通过一个Saga协调器来按顺序调用各个本地事务。
优点
- 易实现:不需要特殊的中间件支持,只需每个服务实现本地事务和补偿逻辑,开发难度相对较低。
- 灵活性高:适用于各种复杂业务场景,可根据业务需求灵活定义本地事务和补偿逻辑。
- 可扩展性强:每个本地事务独立,便于微服务架构的扩展。
缺点
- 一致性弱:补偿操作执行时,可能数据已不一致一段时间,属于最终一致性。
- 协调复杂:特别是在事件驱动方式下,事件的顺序、重试等处理较为复杂,可能导致数据不一致问题。
- 日志维护成本:需要记录所有本地事务和补偿操作日志,以便故障恢复,增加了维护成本。
TCC模式
原理
- 定义:TCC模式将事务分为三个阶段:Try阶段、Confirm阶段和Cancel阶段。Try阶段主要是对业务资源进行检测和预留;Confirm阶段在Try成功后,正式提交业务操作;Cancel阶段在Try失败时,取消之前预留的业务资源。
- 执行流程:以订单支付为例,Try阶段订单服务检查订单状态并冻结相关金额,库存服务检查库存并冻结库存;Confirm阶段如果Try阶段所有操作成功,订单服务更新订单为已支付,库存服务扣减库存;若Try阶段有任何操作失败,Cancel阶段订单服务解冻金额,库存服务解冻库存。
优点
- 强一致性:在整个事务执行过程中,资源处于预留状态,保证了数据一致性。
- 故障恢复性好:由于有明确的Cancel阶段,在出现故障时能较好地回滚已执行操作。
缺点
- 开发成本高:每个服务都需要实现Try、Confirm和Cancel三个操作,对业务侵入性大。
- 性能损耗:资源在Try阶段被预留,直到Confirm或Cancel阶段才释放,可能导致资源长时间占用,影响系统性能。
- 复杂性高:需要协调多个服务的Try、Confirm和Cancel操作,出现网络故障等情况时,协调处理复杂。
模式选择
- 业务实时性要求:如果业务对实时一致性要求极高,如金融交易场景,TCC模式更合适,能保证数据强一致性;若业务允许一定时间内的最终一致性,如电商下单后库存和订单状态更新,Saga模式即可满足。
- 业务复杂性:对于复杂业务流程,Saga模式灵活性更高,能更好适应;而简单且对一致性要求严格的业务,TCC模式虽然开发成本高,但能有效保证一致性。
- 性能考量:若系统资源紧张,对性能要求高,Saga模式不会长时间占用资源,更具优势;若资源充足,TCC模式的一致性优势更突出。
- 开发团队技术能力:若开发团队对复杂协调逻辑处理经验丰富,可选择Saga模式;若团队对业务代码改造接受度高,TCC模式也可考虑。