当前位置: 首页 > news >正文

论分布式事务及其解决方案 架构师论文范文(考试笔记)

 

请围绕“论分布式事务及其解决方案”论题,依次从以下三个方面进行论述。

1、概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。

2、请介绍4种分布式事务的解决方案及简单说明。

3、具体阐述你参与的软件项目是如何做到分布式事务的,过程中遇到哪些问题,是如何解决的。

摘要:

     2024年3月我很幸运参与了河南某大型电商系统的升级改造项目,在该项目中我担任系统分析及架构设计负责人,负责对系统整体进行分析及架构设计。本系统的业务涵盖了商品展示、购物车管理、订单管理、支付结算以及物流配送等多个模块,考虑到系统用户点击率及流量问题,我们团队讨论决定采用分布式架构来部署多个微服务进行业务处理,以满足系统中的高并发和可扩展的需求。本系统在实施一年多期间,每天的订单数量达到几千到几万不等,系统的稳定性及易用性受到了客户及企业的一致好评。

 正文:

      在大型电商平台升级改造项目中,其业务涵盖商品展示、购物车、订单处理、支付结算及物流配送等诸多环节,每日订单量达数十万笔。系统采用分布式微服务架构,由商品、订单、支付等多个服务构成。此项目背景下,分布式事务问题成为关键挑战。因各服务相互独立又需协同,如订单服务创建订单与支付服务完成支付,如何确保两者操作的一致性,避免出现订单创建成功但支付失败或支付成功却订单创建异常等情况,是亟待解决的核心问题。

为攻克该难题,我们采取了消息队列结合 TCC(Try - Confirm - Cancel)的综合方案。在用户下单时,订单服务率先进入 TCC 的 Try 阶段,锁定商品库存,同时将订单创建消息发送至消息队列。支付服务从队列获取消息开展支付操作,支付成功后,以消息形式通知订单服务。订单服务接收到成功通知,执行 TCC 的 Confirm 阶段,完成订单状态更新与库存实际扣减;若支付失败,则执行 Cancel 阶段,释放库存。

      在这个过程中,我们遭遇了一系列问题。消息丢失方面,因网络波动等因素,消息队列时有消息丢失现象。对此,在发送端增添消息确认机制,未收到队列确认即重试;接收端开启持久化存储。TCC 业务逻辑复杂问题上,开发通用 TCC 框架,提供统一接口与模板代码,降低开发难度。幂等性问题上,通过业务单号进行幂等性校验,避免消息重复消费导致的操作重复。凭借这些举措,我们成功解决分布式事务难题,保障了电商平台订单与支付流程的可靠与一致,满足了高并发业务需求。

        接下来我将从解决方案及分布式实现办法和项目中遇到的问题中详细介绍我们所采取的分布式事务的解决方案。

  1. 解决方案

        两阶段提交协议(2PC)将事务的提交过程分为两个阶段。第一阶段是准备阶段,协调者向所有参与者发送准备请求,参与者执行事务操作,但不真正提交,而是记录日志并向协调者反馈准备结果。第二阶段是提交阶段,如果所有参与者都反馈准备成功,协调者向参与者发送提交请求,参与者正式提交事务;若有任何一个参与者反馈失败,协调者则发送回滚请求。其优点是能够保证强一致性,但缺点也很明显,存在单点故障问题(协调者故障影响全局),并且同步阻塞会导致性能低下,尤其在高并发场景下表现不佳。

        三阶段提交协议(3PC)是对 2PC 的改进。它在 2PC 的基础上增加了一个预询问阶段。在预询问阶段,协调者先询问参与者是否有能力执行事务,参与者回复自己的状态。如果所有参与者都回复可以执行,再进入准备阶段和提交阶段。3PC 解决了 2PC 中协调者单点故障导致的参与者长时间阻塞问题,但依然存在性能瓶颈,且实现相对复杂。

        利用消息队列来实现分布式事务,主要思路是将事务操作转化为消息发送到消息队列中。例如在电商场景中,用户下单后,订单服务将订单创建消息发送到消息队列,支付服务从队列中获取消息进行支付处理。如果支付成功,再通过消息通知订单服务完成订单状态更新等后续操作。这种方式的优点是异步解耦,性能较好,缺点是消息可能会丢失或重复消费,需要额外的消息确认和幂等性处理机制来保证事务的最终一致性。

         TCC 分为三个操作阶段。Try 阶段尝试执行事务,完成业务检查和资源预留;Confirm 阶段确认执行事务,真正提交资源;Cancel 阶段取消执行事务,释放预留资源。以订单支付为例,Try 阶段锁定库存、冻结支付金额等,Confirm 阶段完成实际的库存扣减和金额划转,Cancel 阶段则是在出现问题时恢复库存和解冻金额。TCC 的优点是性能较好,适用于对数据一致性要求较高且业务可拆分的场景,但缺点是对业务侵入性较大,每个操作都需要开发对应的三个阶段逻辑。

2 分布式事务实现

        在我们的电商项目中,对于订单创建和支付这一关键流程,采用了消息队列结合 TCC 的混合方案。在用户下单时,订单服务首先采用 TCC 的 Try 阶段,锁定商品库存,同时将订单创建消息发送到消息队列。支付服务从消息队列获取订单消息后,进行支付操作,支付成功后,通过消息通知订单服务。订单服务接收到支付成功消息后,执行 TCC 的 Confirm 阶段,完成订单状态更新和库存实际扣减;若支付失败,订单服务执行 Cancel 阶段,释放库存。

3 遇到的问题及解决方法

        消息丢失问题:在测试过程中发现,由于网络波动等原因,消息队列偶尔会出现消息丢失情况。为解决此问题,我们在消息发送端增加了消息确认机制,发送消息后等待消息队列的确认回复,如果未收到确认则进行重试。同时在消息接收端,开启持久化存储,确保消息在消费前不会丢失。

        TCC 业务逻辑复杂性问题:TCC 模式对业务逻辑有一定侵入性,开发人员需要编写较多的代码来实现三个阶段的逻辑。我们通过开发通用的 TCC 框架来简化开发过程,框架提供了统一的接口和模板代码,开发人员只需关注具体业务逻辑的实现,提高了开发效率和代码的可维护性。

         幂等性问题:由于消息可能重复消费,导致业务操作重复执行。我们在业务接口上增加幂等性校验,通过唯一的业务单号来标识每一次操作,在执行操作前先检查该单号是否已被处理过,如果已处理则直接返回结果,避免重复操作,保证了事务的一致性。

        通过综合运用上述解决方案和问题处理措施,我们在项目中有效地实现了分布式事务,确保了订单和支付流程的一致性和可靠性,满足了电商平台高并发、高可用的业务需求。

相关文章:

  • 电力系统惯性与惯量关系解析
  • SCI论文结构笔记
  • ctfshow-web-新春欢乐杯
  • 【使用层次序列构建二叉树(数据结构C)】
  • 脚本分享:快速作图对比wannier拟合能带python脚本
  • 深入理解C语言变量:从基础到实践
  • 《深入浅出ProtoBuf:从环境搭建到高效数据序列化》​
  • 三串口进行试验
  • 如何将 sNp 文件导入并绘制到 AEDT (HFSS)
  • Vue多地址代理端口调用
  • version `GLIBCXX_3.4.32‘ not found 解决方法
  • Coding Practice,48天强训(23)
  • BIOS主板(非UEFI)安装fedora42的方法
  • How to haggle over salary with HR
  • 从LLM到AI Agent的技术演进路径:架构解析与实现逻辑
  • 软考【网络工程师】2023年5月上午题答案解析
  • 截至2025年4月,AI硬件已深度融入各自场景!!
  • OCR定制识别:解锁文字识别的无限可能
  • Python3:文件操作
  • Lesar: 面向 Lustre/Scade 语言的形式化模型检测工具
  • 大家聊中国式现代化|邓智团:践行人民城市理念,开创人民城市建设新局面
  • ​王毅会见塔吉克斯坦外长穆赫里丁
  • 美联储官员:货币政策不会立即改变,金融市场波动或致美国经济增长承压
  • 从篆刻书画到装帧设计,再看钱君匋的“艺兼众美”
  • 沈阳市委常委马原出任阜新市委副书记、市政府党组书记
  • 冯象|那“交出”后的崩溃,如撒旦坠落诸天