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

news2025/7/14 4:29:47

 

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

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 框架来简化开发过程,框架提供了统一的接口和模板代码,开发人员只需关注具体业务逻辑的实现,提高了开发效率和代码的可维护性。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2343493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS 快速入门教程04

12.激光雷达工作原理 激光雷达的作用是探照周围障碍物的距离,按照测量维度可以分为单线雷达和多线雷达。 按照测量原理可以分为三角测距雷达和TOF雷达。按照工作方式可以分为固态雷达和机械旋转雷达。 本次讲解以TOF雷达为例,雷达发射器发射激光遇到障碍…

2025 年导游证报考条件新政策解读与应对策略

2025 年导游证报考政策有了不少新变化,这些变化会对报考者产生哪些影响?我们又该如何应对?下面就为大家详细解读新政策,并提供实用的应对策略。 最引人注目的变化当属中职旅游类专业学生的报考政策。以往,中专学历报考…

vscode切换Python环境

跑深度学习项目通常需要切换python环境,下面介绍如何在vscode切换python环境: 1.点击vscode界面左上角 2.在弹出框选择对应kernel

Spark-Streaming(三)

一. kafka和flume的整合 任务需求一:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台 1. 在flume/conf/目录下添加flume-kafka.conf文件 配置文件如下 2. 启动flume和kafka消费者 3. 传入数据 查看fl…

SQLite 是什么?

📌 一、SQLite 是什么? SQLite 是一个轻量级、嵌入式数据库,意思是它直接集成在你的 App 内部,不需要单独安装数据库服务端。 ✅ 特点: 特点说明本地使用所有数据保存在手机内部存储文件形式数据以 .db 文件形式存储…

海之淀攻略

家长要做的功课 家长可根据孩子情况,需要做好以下功课: 未读小学的家长:了解小学小升初派位初中校额到校在读小学的家长:了解小升初派位初中校额到校在读初中的家长:了解初中校额到校 越是高年级的家长,…

PCIe具体解释分析

参考文章 PCIe总线详解_STATEABC-GitCode 开源社区 https://zhuanlan.zhihu.com/p/652808759 PCI总线学习(一):PCI总线结构-CSDN博客 PCI——第1章——PCI总线的基本知识-CSDN博客 计算机中register、cache、memory的区别 - Lines Blog 什么是内存管理单元&#xff…

Golang | 迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种顺序访问聚合对象(如列表、树等集合结构)中元素的方法,而无需暴露其底层实现细节。通过将遍历逻辑与集合本身解耦,迭代器模式使…

使用命令行加密混淆C#程序

C#作为托管语言编译生成的IL中间代码极易被反编译工具还原源码。据统计,超过83%的商业软件曾遭遇过代码逆向风险,导致核心算法泄露、授权被跳过. 因此对于C#语言开发的程序来说, 在发布前进行混淆和加密非常有必要. 本文主要介绍如何使用恒盾C#混淆加密…

当智驾成标配,车企暗战升级|2025上海车展

文|刘俊宏 编|王一粟 智能化无处不在的2025年上海车展,回归了卖车的初衷。 光锥智能在展会暴走两天,最大的感触是今年的车展少了争奇斗艳,多了些许务实。 回顾智能汽车时代的三场重要车展。2023年的上海车展充满了…

在网上找的资料怎样打印出来?

在数字化时代,我们经常需要从互联网上获取各种资料,无论是学术论文、工作文档还是学习资料。然而,如何高效地将这些网上的资料打印出来,却是一个值得探讨的问题。本文将为您提供一个全面的解决方案,帮助您轻松完成网上…

算法训练营 Day1

努力追上那个曾经被寄予厚望的自己 —— 25.4.25 一、LeetCode_26 删除有序数组中的重复项 给你⼀个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现⼀次 ,返回删除后数组的 新⻓度。元素的 相对顺序 应该保持 ⼀致 …

【linux】Chrony服务器

简介 1.1 时间的重要性 由于 IT 系统中,准确的计时非常重要,有很多种原因需要准确计时: 在网络传输中,数据包括和日志需要准确的时间戳 各种应用程序中,如订单信息,交易信息等 都需要准确的时间戳 1.2 时区…

技术视界 | 数据的金字塔:从仿真到现实,机器人学习的破局之道

在人工智能的世界里,有一个共识正逐渐达成——谁掌握了数据,谁就掌握了未来。 尤其是在机器人技术迅速演进的今天,“如何让机器人理解世界、学习操作”这一问题的根源,越来越回归到数据本身。正如一座金字塔般,不同层…

wsl联通外网

在C:\Users<你的用户名>下&#xff0c;新建.wslconfig文件添加如下配置&#xff08;具体配置参考官方文档&#xff09;&#xff1a; # Settings apply across all Linux distros running on WSL 2 [wsl2]# Limits VM memory to use no more than 4 GB, this can be set …

shadcn/radix-ui的tooltip高度定制arrow位置

尝试了半天&#xff0c;后来发现&#xff0c;不支持。。。。。就是不支持 那箭头只能居中 改side和align都没用&#xff0c;下面有在线实例 https://codesandbox.io/p/sandbox/radix-ui-slider-forked-zgn7hj?file%2Fsrc%2FApp.tsx%3A69%2C21 但是呢&#xff0c; 第一如果…

【专题刷题】二分查找(二)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

C++_数据结构_详解红黑树

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&…

数据结构手撕--【二叉树】

目录 定义结构体&#xff1a; 初始化&#xff1a; 手动创建一个二叉树&#xff1a; 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历 二叉树节点个数&#xff1a; 叶子节点个数&#xff1a; 二叉树第k层节点个数&#xff1a; 二叉树的高度&#xff1a; 查找值为x…

.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架

文章目录 引言Xamarin 起源&#xff1a;MAUI 的前身Xamarin 的创立&#xff08;2011年&#xff09;Xamarin Studio 与 Visual Studio 集成&#xff08;2013年&#xff09;Xamarin.Forms 的诞生&#xff08;2014年&#xff09;微软收购Xamarin&#xff08;2016年&#xff09; .N…