论分布式事务及其解决方案 架构师论文范文(考试笔记)
请围绕“论分布式事务及其解决方案”论题,依次从以下三个方面进行论述。
1、概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。
2、请介绍4种分布式事务的解决方案及简单说明。
3、具体阐述你参与的软件项目是如何做到分布式事务的,过程中遇到哪些问题,是如何解决的。
摘要:
2024年3月我很幸运参与了河南某大型电商系统的升级改造项目,在该项目中我担任系统分析及架构设计负责人,负责对系统整体进行分析及架构设计。本系统的业务涵盖了商品展示、购物车管理、订单管理、支付结算以及物流配送等多个模块,考虑到系统用户点击率及流量问题,我们团队讨论决定采用分布式架构来部署多个微服务进行业务处理,以满足系统中的高并发和可扩展的需求。本系统在实施一年多期间,每天的订单数量达到几千到几万不等,系统的稳定性及易用性受到了客户及企业的一致好评。
正文:
在大型电商平台升级改造项目中,其业务涵盖商品展示、购物车、订单处理、支付结算及物流配送等诸多环节,每日订单量达数十万笔。系统采用分布式微服务架构,由商品、订单、支付等多个服务构成。此项目背景下,分布式事务问题成为关键挑战。因各服务相互独立又需协同,如订单服务创建订单与支付服务完成支付,如何确保两者操作的一致性,避免出现订单创建成功但支付失败或支付成功却订单创建异常等情况,是亟待解决的核心问题。
为攻克该难题,我们采取了消息队列结合 TCC(Try - Confirm - Cancel)的综合方案。在用户下单时,订单服务率先进入 TCC 的 Try 阶段,锁定商品库存,同时将订单创建消息发送至消息队列。支付服务从队列获取消息开展支付操作,支付成功后,以消息形式通知订单服务。订单服务接收到成功通知,执行 TCC 的 Confirm 阶段,完成订单状态更新与库存实际扣减;若支付失败,则执行 Cancel 阶段,释放库存。
在这个过程中,我们遭遇了一系列问题。消息丢失方面,因网络波动等因素,消息队列时有消息丢失现象。对此,在发送端增添消息确认机制,未收到队列确认即重试;接收端开启持久化存储。TCC 业务逻辑复杂问题上,开发通用 TCC 框架,提供统一接口与模板代码,降低开发难度。幂等性问题上,通过业务单号进行幂等性校验,避免消息重复消费导致的操作重复。凭借这些举措,我们成功解决分布式事务难题,保障了电商平台订单与支付流程的可靠与一致,满足了高并发业务需求。
接下来我将从解决方案及分布式实现办法和项目中遇到的问题中详细介绍我们所采取的分布式事务的解决方案。
两阶段提交协议(2PC)将事务的提交过程分为两个阶段。第一阶段是准备阶段,协调者向所有参与者发送准备请求,参与者执行事务操作,但不真正提交,而是记录日志并向协调者反馈准备结果。第二阶段是提交阶段,如果所有参与者都反馈准备成功,协调者向参与者发送提交请求,参与者正式提交事务;若有任何一个参与者反馈失败,协调者则发送回滚请求。其优点是能够保证强一致性,但缺点也很明显,存在单点故障问题(协调者故障影响全局),并且同步阻塞会导致性能低下,尤其在高并发场景下表现不佳。
三阶段提交协议(3PC)是对 2PC 的改进。它在 2PC 的基础上增加了一个预询问阶段。在预询问阶段,协调者先询问参与者是否有能力执行事务,参与者回复自己的状态。如果所有参与者都回复可以执行,再进入准备阶段和提交阶段。3PC 解决了 2PC 中协调者单点故障导致的参与者长时间阻塞问题,但依然存在性能瓶颈,且实现相对复杂。
利用消息队列来实现分布式事务,主要思路是将事务操作转化为消息发送到消息队列中。例如在电商场景中,用户下单后,订单服务将订单创建消息发送到消息队列,支付服务从队列中获取消息进行支付处理。如果支付成功,再通过消息通知订单服务完成订单状态更新等后续操作。这种方式的优点是异步解耦,性能较好,缺点是消息可能会丢失或重复消费,需要额外的消息确认和幂等性处理机制来保证事务的最终一致性。
TCC 分为三个操作阶段。Try 阶段尝试执行事务,完成业务检查和资源预留;Confirm 阶段确认执行事务,真正提交资源;Cancel 阶段取消执行事务,释放预留资源。以订单支付为例,Try 阶段锁定库存、冻结支付金额等,Confirm 阶段完成实际的库存扣减和金额划转,Cancel 阶段则是在出现问题时恢复库存和解冻金额。TCC 的优点是性能较好,适用于对数据一致性要求较高且业务可拆分的场景,但缺点是对业务侵入性较大,每个操作都需要开发对应的三个阶段逻辑。
在我们的电商项目中,对于订单创建和支付这一关键流程,采用了消息队列结合 TCC 的混合方案。在用户下单时,订单服务首先采用 TCC 的 Try 阶段,锁定商品库存,同时将订单创建消息发送到消息队列。支付服务从消息队列获取订单消息后,进行支付操作,支付成功后,通过消息通知订单服务。订单服务接收到支付成功消息后,执行 TCC 的 Confirm 阶段,完成订单状态更新和库存实际扣减;若支付失败,订单服务执行 Cancel 阶段,释放库存。
消息丢失问题:在测试过程中发现,由于网络波动等原因,消息队列偶尔会出现消息丢失情况。为解决此问题,我们在消息发送端增加了消息确认机制,发送消息后等待消息队列的确认回复,如果未收到确认则进行重试。同时在消息接收端,开启持久化存储,确保消息在消费前不会丢失。
TCC 业务逻辑复杂性问题:TCC 模式对业务逻辑有一定侵入性,开发人员需要编写较多的代码来实现三个阶段的逻辑。我们通过开发通用的 TCC 框架来简化开发过程,框架提供了统一的接口和模板代码,开发人员只需关注具体业务逻辑的实现,提高了开发效率和代码的可维护性。
幂等性问题:由于消息可能重复消费,导致业务操作重复执行。我们在业务接口上增加幂等性校验,通过唯一的业务单号来标识每一次操作,在执行操作前先检查该单号是否已被处理过,如果已处理则直接返回结果,避免重复操作,保证了事务的一致性。
通过综合运用上述解决方案和问题处理措施,我们在项目中有效地实现了分布式事务,确保了订单和支付流程的一致性和可靠性,满足了电商平台高并发、高可用的业务需求。
相关文章:

论分布式事务及其解决方案 架构师论文范文(考试笔记)
请围绕“论分布式事务及其解决方案”论题,依次从以下三个方面进行论述。 1、概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。 2、请介绍4种分布式事务的解决方案及简单说明。 3、具体阐述你参与的软件项目是如何做到分布式事务的,过程中…...

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 文件形式存储…...
两段文本比对,高亮出差异部分
用法一:computed <div class"card" v-if"showFlag"><div class"info">*红色背景为已删除内容,绿色背景为新增内容</div><el-form-item label"与上季度比对:"><div class"comp…...
成熟的前端vue vite websocket,Django后端实现方案包含主动断开websocket连接的实现
可参考实现方式点击进入查看 具体实现方案如下所示: import { useWebsocketMsessageStore } from /stores/websocketMsessageStore.js import {ElMessage} from "element-plus"; import {useUserStore} from "/stores/userStore.js"; // impo…...
2.5 桥梁桥面系及附属结构施工
2.5.1 桥面系施工 1.排水设施 设置纵横坡及泄水孔,减少桥面积水、防排结合。汇水槽、泄水孔顶面高程低于桥面铺装10-15mm。泄水孔边缘设渗水盲沟泄水管下端至少应伸出构筑物底面100-150mm。泄水管通过竖向管道直接引至地面或雨水管线。竖向管道抱箍、卡环、定位卡…...
Markdown格式思维导图——用DeepSeek从PDF内容提取关键信息的有效方法
结构化PDF的思维导图提取方法 当PDF文档结构清晰,包含明确的章节和小节标题时,可以使用以下提示词: 读取上方的PDF,请帮我生成一个结构清晰的思维导图,包含以下内容: 1. 提取PDF中的主要标题作为思维导图…...

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

PCIe具体解释分析
参考文章 PCIe总线详解_STATEABC-GitCode 开源社区 https://zhuanlan.zhihu.com/p/652808759 PCI总线学习(一):PCI总线结构-CSDN博客 PCI——第1章——PCI总线的基本知识-CSDN博客 计算机中register、cache、memory的区别 - Lines Blog 什么是内存管理单元ÿ…...
【阿里云大模型高级工程师ACP习题集】2.5 优化RAG应用提升问答准确度(⭐️⭐️⭐️ 重点章节!!!)
习题集 【单选题】在RAG应用的文档解析与切片阶段,若遇到文档类型不统一,部分格式的文档不支持解析的问题,以下哪种解决方式不可行?( ) A. 开发对应格式的解析器 B. 转换文档格式 C. 直接忽略该类型文档 D. 改进现有解析器以支持更多格式 【多选题】在选择向量数据库时,…...

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

使用命令行加密混淆C#程序
C#作为托管语言编译生成的IL中间代码极易被反编译工具还原源码。据统计,超过83%的商业软件曾遭遇过代码逆向风险,导致核心算法泄露、授权被跳过. 因此对于C#语言开发的程序来说, 在发布前进行混淆和加密非常有必要. 本文主要介绍如何使用恒盾C#混淆加密…...
MYSQL 常用数值函数 和 条件函数 详解
一、数值函数 1、ROUND(num, decimals) 四舍五入到指定小数位。 SELECT ROUND(3.1415, 2); -- 输出 3.142、ABS(num) 取绝对值 SELECT ABS(-10); -- 输出 103、CEIL(num) / FLOOR(num) 向上/向下取整 SELECT CEIL(3.2), FLOOR(3.7); -- 输出 4 和 34、MOD(num1, num2) 取…...

当智驾成标配,车企暗战升级|2025上海车展
文|刘俊宏 编|王一粟 智能化无处不在的2025年上海车展,回归了卖车的初衷。 光锥智能在展会暴走两天,最大的感触是今年的车展少了争奇斗艳,多了些许务实。 回顾智能汽车时代的三场重要车展。2023年的上海车展充满了…...
QuecPython+GNSS:实现快速定位
概述 QuecPython 结合 GNSS(全球导航卫星系统)模块为物联网设备提供开箱即用的定位能力解决方案。该方案支持 GPS/北斗/GLONASS/Galileo 多系统联合定位,为物联网开发者提供从硬件接入到云端服务的全栈式定位解决方案。 优势特点 多体系定…...
[java八股文][Java基础面试篇]设计模式
volatile和sychronized如何实现单例模式 public class SingleTon {// volatile 关键字修饰变量 防止指令重排序private static volatile SingleTon instance null;private SingleTon(){}public static SingleTon getInstance(){if(instance null){//同步代码块 只有在第一次…...

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

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

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

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

wsl联通外网
在C:\Users<你的用户名>下,新建.wslconfig文件添加如下配置(具体配置参考官方文档): # 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位置
尝试了半天,后来发现,不支持。。。。。就是不支持 那箭头只能居中 改side和align都没用,下面有在线实例 https://codesandbox.io/p/sandbox/radix-ui-slider-forked-zgn7hj?file%2Fsrc%2FApp.tsx%3A69%2C21 但是呢, 第一如果…...

【专题刷题】二分查找(二)
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...

C++_数据结构_详解红黑树
✨✨ 欢迎大家来到小伞的大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 小伞的主页:xiaosan_blog 制作不易!点个赞吧!!谢谢喵!&…...

数据结构手撕--【二叉树】
目录 定义结构体: 初始化: 手动创建一个二叉树: 前序遍历: 中序遍历: 后序遍历 二叉树节点个数: 叶子节点个数: 二叉树第k层节点个数: 二叉树的高度: 查找值为x…...
【刷题Day26】Linux命令、分段分页和中断(浅)
说下你常用的 Linux 命令? 文件与目录操作: ls:列出当前目录的文件和子目录,常用参数如-l(详细信息)、-a(包括隐藏文件)cd:切换目录,用于在文件系统中导航m…...
星火燎原:大数据时代的Spark技术革命在数字化浪潮席卷全球的今天,海量数据如同奔涌不息的洪流,传统的数据处理方式已难以满足实时、高效的需求。
星火燎原:大数据时代的Spark技术革命 在数字化浪潮席卷全球的今天,海量数据如同奔涌不息的洪流,传统的数据处理方式已难以满足实时、高效的需求。Apache Spark作为大数据领域的璀璨明星,凭借其卓越的性能和强大的功能,…...