1. 分布式事务简介
分布式事务,这四个字看着好像挺高大上,很多程序员一听到,心里头都会发怵:
是不是又要加班?是不是又是那个“老板觉得3天能搞定”的东西?
但其实,它的本质问题一点都不新鲜,其实就是本地事务的分布式版本而已:
1.1 本地事务
想要了解分布式事务,一定要先了解什么是本地事务
大多数场景下,我们的应用都只需要操作单一的数据库,这种情况下的事务称之为本地事务(Local Transaction)。本地事务的ACID特性是数据库直接提供支持。本地事务应用架构如下所示:
在JDBC编程中,我们通过java.sql.Connection对象来开启、关闭或者提交事务。代码如下所示:
Connection conn = ... //获取数据库连接
conn.setAutoCommit(false); //开启事务
try{
//...执行增删改查sql
conn.commit(); //提交事务
}catch (Exception e) {
conn.rollback();//事务回滚
}finally{
conn.close();//关闭链接
}
1.2 分布式事务
在微服务架构中,完成某一个业务功能可能需要横跨多个服务,操作多个数据库。这就涉及到到了分布式事务,需要操作的资源位于多个资源服务器上,而应用需要保证对于多个资源服务器的数据操作,要么全部成功,要么全部失败。
本质上来说,分布式事务就是为了保证不同资源服务器的数据一致性。
用个简单的例子解释就明白了:
假设你在一个连锁超市工作,顾客A在北京买了瓶水,然后又跑到上海买了个面包。问题来了——两个城市的收银系统要同步:账上得记着人家消费了两样东西,库存也得扣掉。可是呢,北京和上海的系统数据经常对不上,要么少算,要么多算。这种跨地域、跨系统的协调问题就是分布式事务的“职场原型”。
典型的分布式事务应用场景
跨库事务
跨库事务指的是,一个应用某个功能需要操作多个库,不同的库中存储不同的业务数据。下图演示了一个服务同时操作2个库的情况:
分库分表
通常一个库数据量比较大或者预期未来的数据量比较大,都会进行分库分表。如下图,将数据库B拆分成了2个库:
对于分库分表的情况,一般开发人员都会使用一些数据库中间件来降低sql操作的复杂性。
如,对于sql:
insert into user(id,name) values (1,"张三"),(2,"李四")
这条sql是操作单库的语法,单库情况下,可以保证事务的一致性。
但是由于现在进行了分库分表,开发人员希望将1号记录插入分库1,2号记录插入分库2。
所以数据库中间件要将其改写为2条sql,分别插入两个不同的分库,此时要保证两个库要不都成功,要不都失败。
因此基本上所有的数据库中间件都面临着分布式事务的问题。
微服务架构
下图演示了一个3个服务之间彼此调用的微服务架构:
Service A完成某个功能需要直接操作数据库,同时需要调用Service B和Service C。
而Service B又同时操作了2个数据库,Service C也操作了一个库。
需要保证这些跨服务调用对多个数据库的操作要么都成功,要么都失败,实际上这可能是最典型的分布式事务场景。
小结:
上述讨论的分布式事务场景中,无一例外的都直接或者间接的操作了多个数据库。如何保证事务的ACID特性,对于分布式事务实现方案而言,是非常大的挑战。同时,分布式事务实现方案还必须要考虑性能的问题,如果为了严格保证ACID特性,导致性能严重下降,那么对于一些要求快速响应的业务,是无法接受的。
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
分布式解决方案
为什么分布式事务这么麻烦?
总结一句就是:分布式事务的难点,就在于“协调难、压力大、两难选择”
问题1:跨服务的“协调难”
分布式系统就是把一个整体的“大锅饭”拆成了好几口“小锅饭”。表面上看挺合理:每个锅分开煮,互不影响,效率更高。
可问题是,这些小锅饭总得对上账啊!如果锅A说“饭好了”,锅B却喊“我这儿米还没下锅呢”,那顾客还不得砸你店?
问题2:高并发的“踩踏事件”
别以为分布式事务只是少数服务的偶尔尴尬。
想想双十一凌晨,几亿人同时下单、支付、抢红包,服务器压力能飙到天上去。
这种时候,一旦某个服务崩了,就好比超市里的收银机瘫了——所有人卡在付款的队伍里,退也退不了,买也买不成,直接“炸场”。
问题3:性能 VS. 一致性,两头都难兼顾
讲到这儿,很多人会问:为啥分布式事务就不能又快又准?
CAP定理告诉你——强一致性、高可用、分区容错性,三者你最多选两个。
换句话说,想要“分布式事务秒结账”,就得牺牲点儿“一致性”;而想做到“账账分毫不差”,就得牺牲点儿性能。
这跟你每个月的时间分配一样——上班、睡觉、娱乐,想全都兼顾?梦里啥都有。
行业现状:解决方案百花齐放,问题也一大堆
有人会说,那就搞分布式事务方案呗!理论上没问题,实践却很迷幻——
- 有人靠“本地消息表”凑合(自己写代码操作数据库,还要处理对账问题,麻烦得要命)。
- 有人用“二阶段提交”(一环套一环的协调,感觉像用高端仪器摆积木)。
- 最近几年流行的“分布式事务中间件”(比如Seata),虽然解放了开发手工敲代码的劳动力,但高并发下还是容易踩坑。
吐槽一句:很多时候,解决方案和问题本身一样复杂。你以为搞个分布式事务是“抡锤子砸钉子”,结果发现需要把钉子从水泥墙里拔出来再重新种棵树。
1. 经典解决方案剖析:两阶段提交协议(2PC)
两阶段提交(Two Phase Commit),就是将提交(commit)过程划分为2个阶段(Phase):
阶段1:
TM(事务管理器)通知各个RM(资源管理器)准备提交它们的事务分支。如果RM判断自己进行的工作可以被提交,那就对工作内容进行持久化,再给TM肯定答复;要是发生了其他情况,那给TM的都是否定答复。
以mysql数据库为例,在第一阶段,事务管理器向所有涉及到的数据库服务器发出prepare"准备提交"请求,数据库收到请求后执行数据修改和日志记录等处理,处理完成后只是把事务的状态改成"可以提交",然后把结果返回给事务管理器。
阶段2
TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare失败的话,则TM通知所有RM回滚自己的事务分支。
以mysql数据库为例,如果第一阶段中所有数据库都prepare成功,那么事务管理器向数据库服务器发出"确认提交"请求,数据库服务器把事务的"可以提交"状态改为"提交完成"状态,然后返回应答。如果在第一阶段内有任何一个数据库的操作发生了错误,或者事务管理器收不到某个数据库的回应,则认为事务失败,回撤所有数据库的事务。数据库服务器收不到第二阶段的确认提交请求,也会把"可以提交"的事务回撤。
两阶段提交方案下全局事务的ACID特性,是依赖于RM的。
一个全局事务内部包含了多个独立的事务分支,这一组事务分支要么都成功,要么都失败。
各个事务分支的ACID特性共同构成了全局事务的ACID特性。也就是将单个事务分支支持的ACID特性提升一个层次到分布式事务的范畴。
2PC存在的问题
- 同步阻塞问题
2PC 中的参与者是阻塞的。在第一阶段收到请求后就会预先锁定资源,一直到 commit 后才会释放。
- 单点故障
由于协调者的重要性,一旦协调者TM发生故障,参与者RM会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。
- 数据不一致
若协调者第二阶段发送提交请求时崩溃,可能部分参与者收到commit请求提交了事务,而另一部分参与者未收到commit请求而放弃事务,从而造成数据不一致的问题。
2. 经典方案剖析:Seata 分布式事务
Seata是什么?
用官方的话说就是:
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。AT模式是阿里首推的模式,阿里云上有商用版本的GTS(Global Transaction Service 全局事务服务)
通俗的解释就是:
Seata 就是帮你管理多个服务干活的“事务管家”。它有两套大杀器:AT 模式和 TCC 模式。
别被这些字母吓到,它们干的活,说白了就像处理公司财务报销——一种是“帮你自动对账”,另一种是“让你每步都签字画押”。
2.1 AT 模式:低侵入的“自动对账”高手
什么是 AT 模式?
假设你是个项目经理,手下人天天报销,各种发票堆成山。AT 模式就像一个智能财务系统,员工只管上传发票,它会帮你自动算钱、报账、审核。如果哪步出了错,比如发票无效,它还能帮你把钱退回来。
Seata AT模式的核心是对业务无侵入,是一种改进后的两阶段提交,其设计思路如下:
- 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
- 二阶段:
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
一句话总结:AT 模式就是“甩手掌柜”,你只管写业务逻辑,回滚的事儿它全包了。但“自动对账”这种事儿,遇到大流量场景,可能会让你怀疑人生。
一阶段:
业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。核心在于对业务sql进行解析,转换成undolog,并同时入库,这是怎么做的呢?
二阶段:
- 分布式事务操作成功,则TC通知RM异步删除undolog
- 分布式事务操作失败,TM向TC发送回滚请求,RM 收到协调器TC发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。
2.2 TCC 模式:每步都画押的“精细化操作”
什么是 TCC 模式?
TCC 是个强管控的解决方案。假设你要给一百个人发奖金,每个人分三步:确定奖金池、发放奖金、确认到账。TCC 模式就要求每一步都明确标记:钱从哪里扣?到账了没有?出了问题咋办?
- Try 阶段:先预留资源,比如锁定账户余额,告诉大家“钱已经备好了”。
- Confirm 阶段:完成操作,比如真的把钱转给员工。
- Cancel 阶段:如果过程中失败了,就把预留的资源退回来。
优缺点:
- 优点:控制精细,能适应更复杂的业务逻辑。
- 缺点:代码侵入性高,每步操作都得你写,累得像手工记账的会计。
- XA是资源层面的分布式事务,强一致性,在两阶段提交的整个过程中,一直会持有资源的锁。
- TCC是业务层面的分布式事务,最终一致性,不会一直持有资源的锁。
TCC 是一种侵入式的分布式事务解决方案,以上三个操作都需要业务系统自行实现,对业务系统有着非常大的入侵性,设计相对复杂。
但优点是 TCC 完全不依赖数据库,能够实现跨数据库、跨应用资源管理,对这些不同数据访问通过侵入式的编码方式实现一个原子操作,更好地解决了在各种复杂业务场景下的分布式事务问题。
一句话总结:TCC 模式适合那些要求严格的场景,就像盖房子之前先把地基打稳。但如果操作多,稍不注意就会“忙中出错”。
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
以用户下单为例
try-commit
try 阶段首先进行预留资源,然后在 commit 阶段扣除资源。如下图:
try-cancel
2.3 压测与现实表现
Seata 的实际表现如何?
理论上,Seata 是为高并发场景设计的,但真到了“双十一”,可能还是会让你“笑着进去哭着出来”。为什么?
- AT 模式瓶颈:高并发下 Undo Log 会爆炸,回滚操作就像“Excel 宏循环崩溃”。
- TCC 模式瓶颈:操作多了,接口调用链会拖慢整个系统,就像老板天天让你确认“工作计划表”,效率直接拉垮。
一句话总结:Seata 是个好帮手,但它也不是万能的,适合中小型分布式事务场景。要是硬扛 10 万 QPS,那得看你整个架构链条行不行了。
那要抗住10万 QPS,比如电商网站,该如何做呢?
3. CP (强一致)和AP(高并发)的 根本冲突
CAP 定理,是分布式系统里的“铁律”,逃也逃不掉。说人话就是:“你开个跨国公司,员工遍布全球,信息还能实时同步,但要是断了网呢?老板、员工和客户能忍谁?”
CAP定理的三个选项:
- 一致性(Consistency,C):所有人看到的账本数据都是最新的。“北京和纽约的系统永远一致,0误差。”
- 可用性(Availability,A):即使系统宕了一部分,你也得能继续买单。“别让顾客付款的时候等出怒火中烧。”
- 分区容错性(Partition Tolerance,P):网络再差,服务再远,也要分区存活。“断了网,你的某些分支还能继续干活。”
问题来了,这三者只能选两个。“鱼和熊掌不可兼得”,这事儿不是耍流氓,是真有物理限制。
CAP的现实抉择:C 和 A,注定有一头要舍弃
假设你是个外卖平台的技术负责人:
强一致性(C) vs 高可用性(A):
顾客下单后,系统需要确保“库存没问题”(C),但如果某个仓库连不上呢?强行追求一致性,可能导致整个订单卡死,顾客和商家都在等。“这不就像早高峰非要等所有红绿灯都同步变绿才能走,一秒内直接全网崩溃。”分区容错性(P)是底线:
因为网络问题在分布式系统里是常态,不可能不支持分区容错。你总不能因为一根光纤被老鼠啃了,就把整个业务全停掉吧?所以,P 是“送分题”。典型选择:CP 还是 AP?
- 如果你是银行:账户余额差一分钱都不行,强一致性(CP)是刚需,性能差点、延迟高点,大家能忍。
- 如果你是电商:顾客能买单、商家能发货,高可用(AP)更重要。库存数据稍微不同步,大不了事后调账。
总结:分布式事务里,选择 CAP 的哪两项,完全取决于你的业务目标。想强一致性?系统性能会变成“龟速”;要高可用?一致性可能得做点妥协。
CAP的工程化演绎:为什么分布式事务这么难?
CAP 定理虽然是理论,但落地到工程实践里,它就成了“妥协的艺术”。分布式事务在 CAP 中的表现无非以下几种:
两阶段提交(2PC):强一致性优先
- 你说“这个钱一定得转”,2PC 的意思就是先锁定转账金额,再真正扣款。听着好像不错,但问题是:耗时,且锁表很容易让其他操作堵死。
- 形象点讲,这像是全家人等着用厕所,而你非要“占坑发呆到确认安全再出来”,这效率能高得了吗?
最终一致性:让步换效率
- 不追求瞬时一致,只要最后对得上账。比如“下单时库存没同步,但30分钟后数据修正”。
- 这就像在职场开会时,大家不同步理解,但会后都通过微信确认:你干A,我干B,确保目标不跑偏。
无事务化(BASE 模型):高并发优先
- 直接抛掉强一致性,追求“尽可能快地完成任务”,比如秒杀抢购。用户下单时不锁库存,顶多告诉你“缺货了”。
- 这方案很“野”,就像某些公司用Excel表跑年度财务,操作快是快,但最后对账基本靠人肉补漏洞。
总结一句:CAP 是个选择题,分布式事务让你不断在“一致性、性能、容错”之间拉扯。没完美答案,只有业务需求决定选哪两个。接下来,我们看看电商业界大佬们是怎么折腾出经典方案的。
4. 经典方案剖析:本地消息表方案(最终一致性)
eBay 的本地消息表方案,一度被捧成分布式事务的“祖师爷级解决方案”。
它的精髓就在于“账实分离”:数据一份一份对,不急着实时对账,但最后一定能对上。
这种设计有点像你先把“工作总结”写进草稿箱,等到老板要时再发邮件,慢是慢了点,但总不会搞错。
其概念图如下:
4.1 设计思路与步骤详解
背景:为啥需要本地消息表?
想象一下,你是个电商平台的后端工程师,现在需要做一个“下单减库存、通知物流发货”的功能。
问题来了:如果库存更新成功了,但物流通知没发出去,系统就变成“订单对外显示成功,仓库和快递却全懵逼”。这就是典型的分布式事务问题。
本地消息表的核心思路:
把“库存减掉”这步操作和“通知物流”分成两段,分别记录在不同的地方。
主数据库先写一条本地消息,表示“我已经扣了库存”;然后,异步通知物流发货。这种模式可以让两边数据最终对得上。
实现步骤:
写入本地消息表:
先在主库里加一张“消息表”,每当业务操作成功后(比如库存减了),写一条记录到消息表中,内容类似“订单号123,扣库存成功”。处理业务逻辑:
把消息表里的记录当作一个“待办清单”,轮询读取消息,逐条执行相关操作,比如通知物流系统发货。异步消费:
消息消费完成后,将该消息标记为“已处理”,或者直接删掉,避免重复操作。
业务对账逻辑详解:
本地消息表是“人肉对账逻辑”的机器化替代方案。系统会不断检查消息表和目标系统之间的状态,如果发现对不上,就自动重试或者报警。就像老板每天追着财务问:“对账单都核对了吗?”
4.2 注意事项与优缺点分析
优点:可靠又简单
- 可靠性高:只要消息写进表里,数据就不容易丢。即使系统崩溃了,重启后还能接着干。
- 实现简单:只需在现有数据库加一张表,没啥额外依赖,连 Redis 都不用。
缺点:
消息表数据爆炸:
一天几百万订单,每条都要写消息表,过几个月后表里的记录可能比你的老板发的 KPI 压力邮件还要多。清理起来就是个坑。对账逻辑复杂:
系统需要不停对比消息表和业务结果,重试、补偿一条不少。时间长了,开发写补偿代码都写出心理阴影了。性能瓶颈:
数据库单表性能撑不住高并发,“消息表”从效率帮手变成了全队的拖油瓶。
4.3 优化实践:基于 RocketMQ 的升级
问题:本地消息表为什么要升级?
消息表方案虽然经典,但它的弊端也很明显:数据库是它的核心,也是它的枷锁。消息多了,性能直接吃紧。想象一下,你把几百万文件都存在 C 盘的桌面文件夹里,文件找起来就像翻垃圾堆。
RocketMQ 的核心思路:
用消息队列代替数据库表。RocketMQ 本质上就是一个高效的“快递员”,它能帮你存储、分发事务消息,确保消息的可靠投递,同时还提供“事务消息”这种强一致性的增强版功能。
具体实现:
- 生产消息:业务系统操作成功后,直接发一条事务消息到 RocketMQ 队列里。
- 异步消费:消费者服务监听队列,收到消息后执行相关操作,比如通知物流系统发货。
- 事务回查:如果 RocketMQ 检测到消息长时间未被确认,会调用生产者的回查接口,确保业务操作是否真的完成。
升级带来的好处:
1. 性能提升:RocketMQ 消息队列能轻松应对每秒数万的消息吞吐,远超传统数据库消息表。
2. 可靠性保障:事务回查机制确保即使服务中途挂掉,消息依然能得到最终处理。
总结一句话:
本地消息表方案是分布式事务的启蒙老师,简单实用但有点老派;RocketMQ 是它的继任者,不仅解决了性能问题,还给了你更多工具去搞定事务一致性。这两者的选择,取决于你的业务规模和技术需求。
下一步,我们看看如何把这套逻辑玩到10万QPS级别
5.4 高并发场景的RocketMQ事务消息架构优化
RocketMQ事务消息在高并发场景中,单靠“原始配置”可能还是不够用,毕竟10W QPS的挑战是全方位的。以下是一些实战中经常用到的优化策略,帮助系统在高压力下也能稳住:
1. 生产端优化:分而治之
核心思路:分区处理,降低竞争
高并发场景下,消息的生产端是第一个“压力山大”的环节。为了不让事务消息的发送变成瓶颈,可以考虑以下优化:
主题分区(Message Sharding):
- 把同一类消息分散到不同的分区队列(Queue)中,比如“订单扣库存消息”按订单号的 hash 值分片。
- 避免所有消息集中到一个队列,造成堆积。
- 形象比喻:就像银行大堂分窗口办业务,你按号排队,窗口多了,自然效率提升。
异步发送:
- RocketMQ 本身支持异步消息发送,主线程只负责发起请求,不等结果直接返回。
- 这就像开会时让秘书代发邮件,自己忙别的事儿,节省时间。
2. 消费端优化:批量与分治
核心思路:批量消费,提高吞吐
消费端是事务消息处理的最后一环,优化得好坏直接影响系统的处理效率:
批量拉取消息(Batch Consumption):
- 一次拉取多条消息,并进行批量处理,避免逐条消费的性能损耗。
- 举例:像快递员一次送十个包裹,比来回跑十趟高效得多。
分治处理逻辑:
- 根据消息内容,按业务场景拆分处理逻辑,避免一个消费者节点处理所有类型的事务。
- 比如,库存消息和物流消息分配到不同的消费者组,专事专办。
3. 延迟消息与幂等机制
延迟消息
RocketMQ 的延迟消息机制,可以用于减缓高峰压力或实现定时对账。例如,秒杀活动中,不用每秒检查库存状态,而是通过延迟触发来减少数据库压力。
- 案例:设置10秒延迟的消息,定时检查订单支付状态,未完成的直接取消。
幂等机制:避免重复处理
- 消息的重复消费是高并发场景的常见问题,可以通过在消费逻辑中引入幂等校验解决。
- 实现方式:
- 在数据库中添加唯一的“消费标记”,每处理一条消息前检查是否已消费。
- 如果已存在标记,直接跳过。
4. 容灾与扩展策略
消息堆积与降级策略
- 当消费者处理不过来时,RocketMQ 支持将消息堆积到队列中,但堆积不能无限增长。
- 降级处理:对某些非核心业务(如推送营销通知)的事务消息,直接转为普通异步消息处理,保证核心流程优先运行。
动态扩容:
- 在流量暴涨时,动态扩容消费端节点,增加消费者实例,分散处理压力。
- 这就像是“双十一”临时加开快递员和仓库分拣线。
总结:稳中有快,优化到位
RocketMQ 的事务消息在高并发场景下不是“开箱即用就完事”,需要结合业务场景进行生产端分区、消费端批量处理、幂等校验、延迟消息等多维度优化。
最终,你会发现事务消息不仅仅是一个“解决一致性”的工具,它还能成为高并发分布式系统里的“压舱石”。接下来,我们进入总结,看看分布式事务的全景方案。
6. 分布式事务全景总结:从理论到实践
搞分布式事务,就像盖一栋“永不倒塌的摩天楼”。从 Seata 的 AT/TCC 模式到 RocketMQ 的事务消息,再到本地消息表,这些方案就像建材库里的各种砖块和钢筋,每种都有优缺点,关键在于如何搭配使用,才能撑起你的业务需求。
以下是对分布式事务的全景回顾和总结,帮你从技术选型到工程实践,找到最适合的路线。
6.1 分布式事务三大流派对比
方案 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Seata AT 模式 | 自动化高,业务侵入少 | 性能一般,不适合复杂分布式场景 | 单数据库事务,中小型业务 |
Seata TCC 模式 | 控制精细,能满足复杂业务 | 开发量大,侵入性强 | 金融、库存等高一致性要求场景 |
本地消息表方案 | 实现简单,稳定可靠 | 性能瓶颈,消息数据易爆炸 | 中低流量分布式事务 |
RocketMQ 事务消息 | 性能高,扩展性强,能适应高并发 | 配置和优化成本较高 | 高并发、对性能要求高的分布式场景 |
最终一致性(BASE) | 性能极高,不锁资源 | 需要容忍短时间数据不一致 | 秒杀、电商支付等对一致性容忍度高的场景 |
6.2 分布式事务的选型建议
1. 业务需求为王
- 强一致性:需要确保一分钱都不能出错?比如银行转账,选择 Seata TCC 或 RocketMQ 事务消息。
- 最终一致性:允许短时间数据不一致?比如秒杀场景,用 RocketMQ 或 BASE 模型。
2. 规模决定复杂度
- 中小型项目:本地消息表足够用,不需要为性能过早优化。
- 大型高并发系统:选 RocketMQ 事务消息,减少数据库压力,提升吞吐量。
3. 技术团队能力
- 如果你的团队对分布式事务理解有限,选择实现简单的方案,比如 Seata AT 或本地消息表。RocketMQ 的事务消息虽然性能强,但需要较高的运维和开发门槛。
6.3 架构进阶:如何支撑10W QPS的分布式事务
如果你的系统目标是支撑10万QPS级别的流量,以下是几条必须遵循的原则:
1. 数据分区,业务拆分
把复杂的分布式事务拆成多个独立子系统,用事件驱动的方式减少事务依赖。比如订单、支付、库存分别独立,靠消息队列进行数据同步。
2. 异步化与最终一致性
不要追求所有流程实时完成,能用异步解决的尽量异步。比如支付完成后,延迟5分钟对账。
3. 动态扩展与限流保护
- 消息队列(如 RocketMQ)支持动态扩展,消费者节点可以根据流量动态增加。
- 引入限流保护机制,防止高峰期消息队列超载导致系统崩溃。
6.4 展望:未来的分布式事务
随着云原生架构和事件驱动设计的普及,分布式事务的形态也在不断演化。未来可能出现更多“去中心化”模式,比如通过区块链技术实现全网的事务一致性,或者利用 AI 优化分布式事务的回查和补偿逻辑。
总结:
分布式事务没有万能方案,只有适合业务的“最佳搭配”。从理论到实践,从本地消息表到 RocketMQ,真正的架构高手不是看用什么工具,而是看如何将它们用到极致。最后,记住分布式事务的一条“真理”——简化业务逻辑,分布式事务才能不让你“被分裂”。
最后说一句(求关注,求赞,别白嫖我)
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享
求一键三连:点赞、分享、收藏
点赞对我真的非常重要!在线求赞,加个关注我会非常感激!