首页 > 其他分享 >微服务架构下如何保证数据一致性

微服务架构下如何保证数据一致性

时间:2024-01-04 15:36:20浏览次数:37  
标签:事务 架构 步骤 业务 本地 一致性 执行 保证数据

公司新产品供应链平台基于Saas的多租户模式设计,采用微服务架构。在前期技术架构选型、基础方案设计的过程中,我就一直在考虑如何保证在微服务架构下的数据一致性。

背景

数据一致性深受重视的原因主要是受老系统的影响。老系统采用单体架构设计,但作为Saas模式提供服务,一个服务集群为几十个仓库提供服务;经过多年持续迭代,内部业务逻辑耦合度极高,作为业务下游,不仅要为上游ERP提供方案兜底,还要为不同的客户提供定制化服务;在公司降本增效的前提下,服务器资源冗余度较低;当然还存在其他原因。在这种情况下,老系统经常出现数据状态不一致的问题。

新产品采用微服务架构设计,结合CAPBASE理论,微服务架构下更无法避免数据一致性的问题。因此,需要更加完整的方案解决这方面的问题。

强一致性和最终一致性

数据一致性有两种解决方案,强一致性最终一致性。在传统的支持事务的数据库中,同一数据源,可利用事务解决;多个数据源,可利用XA 两阶段提交达到强一致性,或重试的方式达到最终一致性。

常见解决方案

XA两阶段提交

XA协议

XA协议规范了DTP分布式事务的模型,该模型定义如下角色:

AP(Application Program):应用程序,可理解为调用分布式事务的应用程序。

TM(Resource Manager):事务管理器,负责协调和管理事务,事务管理器控制全局事务,管理事务生命周期。全局事务是指分布式事务处理环境中,需要操作多个数据库共同完成一个工作,这个工作即是一个全局事务。

RM(Transaction Manager):资源管理器,可以理解为事务的参与者,一般情况是指一个数据库实例,控制分支事务。

两阶段提交

两阶段提交是将整个事务(全局事务)分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase)。

准备阶段

事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事务,并写本地Undo/Redo日志,此时事务并未提交。

提交阶段

准备阶段全部成功,事务管理器给每个参与者发送提交(Commit)消息;如果有任一参与者执行失败,则发送(Rollback)消息。

注意:最后阶段才释放锁资源。

TCC模式

TCC(Try-Confirm-Cancel)是一种分布式事务解决方案,通过在业务逻辑中嵌入Try-Confirm-Cancel三个阶段,保证事务的一致性。

  • Try阶段:业务条件判断逻辑检查,预占资源。
  • Confirm阶段:业务逻辑确认执行结果,确认通过则提交操作,否则回滚操作。
  • Cancel阶段:业务逻辑撤销之前执行的操作,释放预占资源。

SAGA模式

Saga模式的一些关键特性:

  • 每个步骤都是原子性的本地事务,可以独立执行,也可以回滚。
  • 每个步骤都记录其状态以便于回滚或提交。
  • 每个步骤都需要明确的指定它的补偿操作,以便在出现故障时可以回滚之前的步骤。
  • 如果某个步骤失败,这需要启动相应的补偿操作以回滚之前的步骤。

综合分析

XA两阶段提交

  • 优点:使用简单,可以像使用本地事务一样使用基于XA的分布式事务,对业务侵入小。
  • 缺点:基于强一致性的同步阻塞协议,锁资源持有时间长,对并发和吞吐量影响较大。且在事务管理器或资源管理器出现连接中断或执行超时的情况下,仍可能导致数据不一致。

TCC模式

对业务侵入大,需要将正常的业务逻辑拆分为三个阶段;一次正常执行分为两个阶段执行,即预占资源和提交两个阶段(Confirm阶段用于异常补偿);业务逻辑中预占资源,对业务状态管理要求高。对开发成本、管理成本及性能均有较大影响。

SAGA模式

每个步骤都需要明确指定其补偿操作,管理成本增加。 相比于TCC模式,SAGA模式性能较好。

总结

XA两阶段提交性能较差,无法接受;TCC模式个人来看真的是在用创造问题的方式解决问题;SAGA模式性能损失较小,可接受。但仍存在几个问题:一是每个步骤需明确指定其补偿操作,开发成本和管理成本增加;二是从补偿操作(业务逻辑回滚)来看,其过程仍存在分布式环境下的数据一致性问题,即如果有多个步骤需要补偿,需要保证多个补偿步骤均能成功执行。

最终解决方案

综上来看,XA两阶段提交、TCC模式、SAGA模式在开发、管理、性能等方面均存在一定的问题。结合我司业务特性,最终采用的解决方案:通过重试达到最终一致性

优势

  • 无性能损失。
  • 将业务隔离为正向流程和逆向流程,正向流程为正常业务逻辑,逆向流程可视为补偿操作,例如取消流程。将正向流程和逆向流程隔离,业务逻辑清晰,降低开发和管理成本。
  • 业务逻辑保证幂等,执行过程异常可通过人工或系统重试,或执行逆向流程。
  • 在分布式环境中,接口执行超时重试是极其有效的解决方案,通过重试达到最终一致性与该设计目标是一致的。

注意:在分布式环境中应尽量保证接口幂等

异常处理

通过重试达到最终一致性,需要解决几个问题:一是异常处理;二是接口幂等。

异常处理

业务逻辑执行异常,需要通过人工或系统重试。对于业务系统来说,需要显式标识业务逻辑异常状态并引导人工重试。 接口调用场景如下:

场景1:

  1. 开启本地事务
  2. 本地业务逻辑执行
  3. 执行RPC命令
  4. 提交本地事务

场景2:

  1. 开启本地事务
  2. 执行RPC命令
  3. 本地业务逻辑执行
  4. 提交本地事务

场景3:

  1. 开启本地事务
  2. 本地业务逻辑执行
  3. 执行RPC命令1
  4. 执行RPC命令2
  5. ...
  6. 提交本地事务

场景4:

  1. 开启本地事务
  2. 本地业务中间状态更新
  3. 提交本地事务
  4. 执行RPC命令1
  5. 执行RPC命令2
  6. ...
  7. 开启本地事务
  8. 本地业务完成状态更新
  9. 提交本地事务

场景1:本地业务逻辑执行一般涉及状态变更,步骤2和步骤3执行异常触发事务回滚,一般情况下不会产生副作用(需要注意步骤3执行超时而最终执行成功的问题)
场景2:如果步骤3执行异常,步骤2已执行的命令无法回滚。
步骤3:如果步骤4执行异常,同样步骤3已的命令无法回滚。
步骤4:加入中间状态,重试幂等保证最终一致性,不产生副作用。同时可结合逆向流程设计。

综合上述场景,针对简单、非核心的业务场景,考虑到开发和管理成本,可采用场景1的执行方式;针对重要的、复杂的业务场景,可采用场景4的执行方式。

接口幂等

默认情况下,接口应设计为支持幂等,例如dubbo默认在接口执行超时的情况下,会自动重试(可配置重试次数),如不支持幂等,可能会产生副作用。考虑到开发和管理成本,我们采用三种方式结合的方式保证幂等:一是唯一索引;二是状态;三是幂等表。

唯一索引:防止实体重复创建,特别是在重试场景下。
状态:一般情况下,业务性较强的场景,可采用状态+乐观锁(防止并发)的方式保证幂等。这种方式简单、直观,开发成本低。
幂等表:用于解决无法通过状态保证幂等的场景,例如库存调整。库存一般作为独立的服务提供接口,对外提供封装的库存调整接口,库存调整封装的命令是无状态的,此时需要在参数中封装业务唯一标识保证幂等。

标签:事务,架构,步骤,业务,本地,一致性,执行,保证数据
From: https://blog.51cto.com/u_16279811/9101648

相关文章

  • 座舱音频系统的架构设计和音频体验
    编者按近年来,智能座舱体验日益成为汽车竞争力的核心,智能座舱的多样体验正在成为用户购车时考虑的重要因素。LiveVideoStack2023深圳站邀请到蔚来汽车座舱音频系统软件负责人高林,从主流音频架构设计、算法集成方案及体验影响、音频体验与整车融合的挑战三个方面,为大家介绍音频软件架......
  • VMware vRealize Automation 8.6 下载 - 现代基础架构自动化
    作者:gc,主页:www.sysin.orgVRealizeAutomation8.6|12October2021vRAEasyInstaller(ISO)build18747964vRAProduct(appliance)build18742031SaltStackConfigbuild18703476VRealizeAutomation8.5|19August2021vRAEasyInstaller(ISO)build18488288vR......
  • VMware Horizon 8 2306 - 虚拟桌面基础架构 (VDI) 和应用软件
    VMwareHorizon82306-虚拟桌面基础架构(VDI)和应用软件作者主页:sysin.orgVersion2306DocumentationReleaseNotesReleaseDate2023-07-06虚拟桌面基础架构(VDI)和应用软件VMwareHorizon通过高效安全地将虚拟桌面和应用从本地部署环境交付到云端,提升数字化工作空间体验......
  • 面向船舶结构健康监测的数据采集与处理系统(一)系统架构
    世界贸易快速发展起始于航海时代,而船舶作为重要的水上交通工具,有其装载量大,运费低廉等优势。但船舶在运营过程中出现的某些结构处应力值过大问题往往会给运营部门造成重大的损失,甚至造成大量的人员伤亡和严重的环境污染,因此实时掌握船舶的监测点应力状况,跟踪船舶各个重要监测......
  • VMware vRealize Automation 8.3 发布 - 现代基础架构自动化
    vRealizeAutomation8.3|17March2021vRAEasyInstaller(ISO)build17556762vRAproduct(appliance)build17551690概述VMwarevRealizeAutomation是一个支持自助式多云环境的现代基础架构自动化平台。借助vRealizeAutomation,客户可以通过自助式自动化提高敏捷性、工......
  • VMware vRealize Automation 8.4 发布 - 现代基础架构自动化
    概述VMwarevRealizeAutomation是一个支持自助式多云环境的现代基础架构自动化平台。借助vRealizeAutomation,客户可以通过自助式自动化提高敏捷性、工作效率和效益,具体方法为:降低其IT环境的复杂性、精简IT流程并提供一个DevOps就绪型自动化平台。易于使用的混合云基础架......
  • DDD落地实践-架构师眼中的餐厅 | 京东云技术团队
    本文以餐厅场景为叙事主线,以领域驱动为核心思想,结合架构设计与功能设计方法论。是从领域分析到落地的全过程案例,内容偏重于落地,因此不乏一些探讨,欢迎指正。文章较长、全程干货、耐心读完、必有收获。本文不针对餐厅的实现细节,重在探讨设计思想和方法。1、领域设计让我们抛开技术人......
  • ElasticSearch 架构设计
    介绍ElasticSearchMySQLIndexTableDocumentRowFieldColumnMappingSchemaQueryDSLSQLaggregationsgroupby,avg,sumcardinality去重distinctreindex数据迁移ElasticSearch中的一个索引由一个或多个分片组成每个分片包含多个segment(分段)每一个分段都是一个倒排索引节点类型节点类......
  • 架构师如何把握项目质量?
    需求分析阶段如果这个需求分析不是自己亲自做的,需要和执行人沟通,通过提出问题,确保当事人正确识别了利益相关者的意图和业务诉求,也便于自己对下面进行阶段的把控。设计阶段设计评审时,设计者需要对相关改动模块做说明,证明其对模块的了解程度。并分析清楚代码改动点和影响。详细设计中......
  • 吉特日化MES 与周边系统集成架构
     作者:情缘 关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路......