掰弯了是什么意思| 区域经理的岗位职责是什么| 孩子腿疼是什么原因| 隽字五行属什么| 女人喝什么茶最好| 女生的名字叫什么好听| 压脚背有什么好处| 7月13号是什么星座| 支气管炎吃什么药最好| 增肌是什么意思| tspot检查阳性能说明什么| 舌头痒痒的是什么原因| 文科女生学什么专业好| 巨蟹座是什么性格| 吃月饼是什么生肖| 空腹血糖偏高是什么原因| 心计是什么意思| 中规中矩什么意思| 晚上睡眠不好有什么办法可以解决| 定心丸什么意思| 什么是条件兵| 梦见找鞋子是什么意思| 张卫健属什么生肖| 不显怀的人有什么特点| 跑步肚子疼是什么原因| 献血浆有什么好处| 舌苔发白是什么原因| 脯氨酸氨基肽酶阳性是什么意思| 女性手麻是什么原因| 宝宝反复发烧是什么原因| 张学良为什么不回大陆| 脾虚要吃什么东西调理| 青鹏软膏主要治疗什么| 窦性心动过速什么意思| 得瑟是什么意思| 马齿苋不能和什么一起吃| 关税是什么| 1月26日是什么星座| 背德是什么意思| 经血是什么血| 藏族信仰什么教| 爸爸的姐姐应该叫什么| 本虚标实是什么意思| 晕血是什么原因| 乙状结肠腺瘤是什么病| 血小板高是什么原因| 什么什么情深| 腿浮肿是什么原因引起的| 天梭手表属于什么档次| 出脚汗是什么原因| 什么叫情商高| 木耳不能和什么食物一起吃| 孕妇胃疼吃什么药| 颈椎头晕吃点什么药| 自讨没趣什么意思| 生门是什么意思| 霉菌性阴炎用什么药止痒效果好| 脚底发黄是什么原因| 抑郁吃什么药| 遗言是什么意思| 鸟字旁有什么字| 势不可挡是什么意思| 什么都别说| 吃什么药能延迟射精| 大便一粒粒的是什么原因| 胰腺炎是什么| 子鼠是什么意思| 教育的目的是什么| 什么叫出柜| 手指甲上的月牙代表什么| 事业编有什么好处| 肾素高说明什么| 胃窦在胃的什么位置| 惊讶表情是什么意思| 股癣用什么药膏好得快| 鬼最怕什么东西| 肩胛骨发麻是什么原因| 法国用什么货币| 油头粉面是什么意思| 黄体酮低吃什么补得快| 粑粑是什么意思| ab型rh阳性是什么意思| 什么样的花| 中国铁塔是干什么的| 新疆人信仰什么教| d代表什么| 痛风病人吃什么菜| 虚岁29岁属什么生肖| 什么样的树| 什么血型不招蚊子| 梦见牛顶我是什么意思| 什么在千里| 六亲不认什么意思| 购置是什么意思| 胎芽是什么意思| 户口分户需要什么条件| 扭曲是什么意思| 佛陀是什么意思| 阻滞是什么意思| 排骨和什么菜搭配最好| 受凉咳嗽吃什么药| 小棉袄是什么意思| 音叉是什么| 解说是什么意思| 小孩指甲有白点是什么原因| 吃瓜什么意思| 仲什么意思| 总做梦是什么原因| 梦见卖衣服是什么意思| 什么是莱赛尔纤维| 发烧了吃什么药| 胸膜牵拉是什么意思| 血沉50说明什么原因| 茉莉花茶属于什么茶类| 明天代表什么生肖| 馒头逼是什么| 锦纶氨纶是什么面料| 脚面肿是什么原因| 舌头白腻厚苔是什么原因| 涤纶是什么材料| 普通门诊和专家门诊有什么区别| 纳财适合做什么| 心魔是什么意思| 张良为什么不救韩信| 一个虫一个尧念什么| 狗皮膏药是什么意思| 7月份适合种什么菜| 锁骨属于什么骨| 喜结连理是什么意思| 吃什么食物最补血| 人为什么会抽筋| 燕子吃什么食物| 罗红霉素和红霉素有什么区别| 灯光什么| reading是什么意思| 卵巢囊性包块是什么意思| 高级护理是干什么的| library是什么意思| 闭门思过是什么意思| 宝宝说话晚是什么原因造成的| 落户什么意思| 肝肾亏虚吃什么中成药| 什么的红烧肉| 吃什么食物可以去湿气| cea是什么检查项目| 确认妊娠是什么意思啊| 芒果对身体有什么好处| b超是检查什么的| 清末民初是什么时候| tmc是什么意思| 肺结节吃什么食物散结节最快| 中指和无名指发麻是什么原因| 蛋白尿是什么症状| ecco是什么品牌| 妈祖属什么生肖| 营销号是什么意思| 紧急避孕药什么时候吃最有效| 法院是什么机关| 降头术是什么| 今年88岁属什么生肖| 薤白的俗名叫什么| 土是什么生肖| 牙疼能吃什么食物| 敌敌畏是什么| 鎏是什么意思| 暗送秋波什么意思| 什么茶降尿酸| 酸奶不能和什么一起吃| 狐臭是什么原因| 流连忘返的返是什么意思| 纯净水和矿泉水有什么区别| 麻疹是什么病| 什么样的降落伞| 和女生聊什么话题| 没壳的蜗牛叫什么| 膝盖后面叫什么部位| 月经粉红色是什么原因| 胎儿左侧侧脑室增宽的原因是什么| 隔离霜有什么作用| 9月27是什么星座| 00后是什么意思| 结肠炎吃什么药效果最好| 左肾肾盂分离什么意思| 缺铁性贫血吃什么食物好| 血小板低是什么原因造成的| 猫尿床是因为什么原因| 计划生育什么时候开始的| 泛醇是什么| 绾色是什么颜色| 农历5月25日是什么星座| bcc是什么意思| tf口红属于什么档次| 主家是什么意思| 1893年属什么生肖| 蝉鸣声耳鸣是什么原因引起的| 通灵是什么意思| 高血压吃什么好降压快| 就读是什么意思| 管科是什么专业| 甲状腺有什么功能| 发配是什么意思| 入睡困难吃什么药| 碳足迹是什么| 尿多是什么原因引起的| 曼字五行属什么| iqr是什么意思| 切除子宫有什么影响| 韬光养晦什么意思| 绝经三年了突然又出血了什么原因| 狗狗呕吐是什么原因| 何炅的老婆叫什么名字| 鸡子是什么东西| 为什么屁股上会长痘| 尿蛋白是什么原因| 公假是什么意思| 什么时候跑步减肥效果最好| 拍肺片挂什么科| 荡气回肠什么意思| 低聚糖是什么| 丑指什么生肖| 12.31什么星座| 愚昧是什么意思| 天下无双是什么生肖| 天空像什么| 欧巴桑是什么意思| 什么药降肌酐最有效| 裸睡是什么意思| 老年人适合吃什么水果| 红细胞平均体积偏低是什么意思| 娃娃衫配什么裤子图片| 6个月宝宝可以吃什么水果| 黄体破裂是什么意思| 日本豆腐是用什么做的| 亚甲炎吃什么药效果好| 纸尿裤nb是什么码| 大姨妈量多是什么原因| 瓜尔佳氏现在姓什么| 阳虚是什么| 振字五行属什么| 脚为什么会脱皮| 萎缩性胃炎伴糜烂吃什么药| 什么叫绿茶| 甲肝是什么病| 做完肠镜需要注意什么| 神经性耳鸣吃什么药好| 黄酒是什么| 七月一号是什么星座| 女人吃当归有什么好处| 孕妇梦见牛是什么意思| 葡萄糖升高说明什么| 怀孕初期分泌物是什么样的| 梦见割草是什么意思| 狗咬了不能吃什么| 白色车里放什么摆件好| 小腹胀痛什么原因| 舌根起泡是什么原因| 狗毛对人体有什么危害| 丈青色是什么颜色| 白细胞低什么原因| 俄罗斯的国花是什么花| 吃薄荷叶有什么好处和坏处| 怀孕了吃什么药能打掉| 梦见牙齿掉了是什么意思| 发烧去医院挂什么科| 百度

浅谈为什么我讨厌分布式事务

CAP,基础理论

百度 今年政府工作报告中四次提及“智能”,并特别指出要“加强新一代人工智能研发应用”、“发展智能产业”。

CAP理论是分布式系统中最核心的理论基础

image

  1. Partition tolerance,分区容错性

the system continues to operate despite arbitrary message loss or failure of part of the system
系统能够在网络分区(网络故障或通信故障)的情况下还能继续提供服务

  1. Consistency,一致性

all nodes see the same data at the same time
所有节点在同一时间的数据是相同的,也就是更新操作完成后,所有节点保存的数据相同

  1. Availability,可用性

Reads and writes always succeed
系统服务一直处于可用状态,

为什么CAP只能满足两个目标

image

C,A,P只能同时满足两个目标,而P是分布式的基本盘,所以需要在C与A之间进行取舍。

  1. 如果要保证服务可用性,就选择AP模型
    选择AP意味着舍弃强一致性,以保证可用性与分区容错性。在AP架构下,系统能够快速响应客户端的请求,即时在网络分区情况下,也尽量保证服部分节点可用,从而为客户端提供不间断的服务,允许临时数据不一致(如异步复制)
  2. 如果要保证数据一致性,就选择CP模型
    选择CP意味着舍弃可用性,以保证一致性与分区容错性。在CP架构下,系统会优先保证数据的一致性,当发生网络分区时,牺牲可用性(如暂停写操作直到分区修复)。
  3. 单机部署,就选择CA模型

场景:
你点外卖,选好商品后提交订单。但此时你刚好在电梯里,网络变差了(网络分区)。
你与服务器失去联系,无法确认订单真的提交成功,但你还是可以操作APP继续浏览菜单的(P,分区容错)。
这时候APP必须做出选择,A VS C.
选A(可用性),直接显示已提交(即使服务器没收到)。但如果网络一直没恢复,订单可能没提交成功,后续你需要重新下单(数据不一致)
选B(一致性),APP直接卡死或者显示加载中,必须等系统确认后才显示成功(数据一定正确,但期间无法操作)。

CAP的理论,只有网络分区发生了,才需要在CAP中进行权衡,但大部分时间,网络分区是不会发生的。因此CAP理论可以作为系统设计时需要衡量的因素,而非绝对的选择。

PACELC,拓展理论

CAP+Everything is Local and Connected = PACELC ,是CAP理论的拓展,上面说到CAP理论是在网络分区发生的情况下才需要考虑的。大多数情况下,系统都是平稳运行。在这种情况下,因为不需要考虑网络分区,所以要考虑就是数据一致与读写延迟的平衡

  1. P
    分布式系统在面对网络分区时(网络故障或通信故障),仍然能够继续运行。
  2. A
    分布式系统在面对故障时,依然能够提供服务并保证数据的可访问性。
  3. C
    分布式系统在面对网络分区时,能够保持数据一致性。
  4. E
    Eventual consistency,最终一致性,分布式系统在面对网络分区时,由于网络延迟或者异步复制等原因,可能会导致节点之间数据的不一致,但最终会达到一致状态
  5. L
    Latency ,延迟,分布式系统的响应时间,在一些情况下,为提高系统响应速度,可能会牺牲一致性或者可用性

image

场景
承接上面的场景,当你出了电梯后,你的网络开始恢复。在此期间你点击了多次提交订单,导致服务器收到了多个重复的订单请求。
此时进入ELC矛盾阶段,在延迟(Latency)和一致性(Consistency)之间需要权衡。
选延迟(Latency),你很快看到订单状态更新,但可能不知道之前的重复提交被自动合并了(牺牲一致性,但用户体验流畅)。
选一致性(Consistency),弹出提示 “检测到多个订单请求,请确认是否需要保留一个”,等你手动选择后再处理。订单一定准确(一致性高),但你需要花时间确认(延迟高)

因此,PACELC也可以理解是对CAP的替代,因为它不仅讲述了网络分区的极端情况下如何取舍,还覆盖了系统正常时应该考虑的事项。

BASE,具体落地理论

Base 理论是 AP 系统的实践指导,通过牺牲强一致性换取高可用性和分区容错性,是 CAP 定理在工程中的具体落地方式。

  1. Basically Available,基本可用
    不追求CAP中的,任何时候读写都可以成功,而是系统能够基本运行,一直提供服务。
    允许损失部分可用,可能是响应时间延长,或者服务降级。

举个例子,如果并发太多超过了系统QPS峰值,可能会提示排队。这就是通过合理手段保护系统的稳定性。

  1. Soft State ,软状态
    允许系统存在中间状态,比如异步复制的延迟。并认为该状态不影响整体运行,也就是允许系统在多个不同的节点的数据副本存在数据延时

比如分布式缓存中,数据副本允许短暂不一致。

  1. Eventually Consistency ,最终一致性
    数据不可能一直是软状态,必须在一个时限之后保证所有副本数据一致。

Base理论的核心是最终一致性,即时无法做到强一致性(Strong Consistency),Application可以根据自身的业务特点,采用适当的方式来达到最终一致性

CAP在基础组件中的应用

如果一个分布式场景需要很强的数据一致性,或者该场景可以接收系统相应很慢的情况。使用CP架构就比较合适了,
保证CP的架构也很多,典型的有Redis,ZooKeeper。
以ZooKeeper为例:
image

zk这种设计保证了CP,需要超过一半节点同意才提交写操作,这中间的可用性是很低的。

如果一个分布式场景需要很强的可用性,且能接收数据暂时不一致,那么使用AP架构就比较合适。
保证AP的架构就很多了,比如数据库的读写分离,Eureka等。为了保证用户体验,牺牲了数据的一致性。

分布式事务

分布式事务是指涉及多个独立数据库或节点的事务操作,需要保证跨节点的数据一致性。由于分布式的特性导致了传统数据库事务的ACID特性难以直接应用

由于CAP理论的桎梏,分布式事务也需要妥协部分特性,转而采用最终一致性(BASE理论)。

2PC,Two-Phase Commit

原理:事务分两阶段提交

  1. PreCommit
    通知所有节点,开启事务并预提交
  2. DoCommit
    根据参与者的反馈,决定提交还是回滚。
    如果参与者全部同意,协调者通知所有参与者提交事务
    如果任一节点失败,协调者通知所有参与者回滚

image

3PC,Three-Phase Commit

从2PC可以看到,如果Service2服务一开始就不可用,Service1与Service3依旧会开启事务。直到协调者通知回滚才关闭事务。这中间的粒度太大了,为了优化这个问题,有了3PC

  1. CanCommit
    多衍生出一个询问阶段,仅询问是否提供服务,不开启事务
  2. PreCommit
    若全部同意,开始事务预提交
  3. DoCommit
    正式提交或者回滚

image

TCC,Try-Confirm-Cancel

尽管3PC缩小了2PC阻塞的粒度,但在PreCommit阶段之后,所有节点都会开启事务,这时候阻塞的粒度,依旧很大,这里还有没有优化空间呢?TCC方案就应运而生。
TCC原理与2/3PC类似,最大不同的点就是,2/3PC依赖数据库的事务机制,TCC更依赖让代码逻辑来变相实现事务

  1. Try
    协调者调用所有微服务API的try接口,将涉及到的资源提前创建或者锁住
  2. Confirm/Cancel
    正式提交或者回滚

image

可以看到,TCC模式在流程上,除了颗粒度小了一点外,没有本质上的区别,那我如果对并发性没有要求的话,可以无脑使用2PC呢?
使用TCC还有一个核心的因素,2PC/3PC是基于数据库的XA协议,比较局限。只能在多个数据库之间实现分布式事务,而大多数情况下,都是微服务之间的API调用,并没有实现XA协议,因此TCC才登上历史舞台。

实现TCC要注意什么?

既然TCC是一种2PC的变种实现,那么它是如何解决Service出现故障后的数据一致性的呢?
答案是不断重试,因为try阶段已经提前创建或者锁定好了所有资源,所以无论是Confirm或者cancel都可以通过不断重试直到成功。

  1. try超时
    比如try过程中很慢(进程还在处理),导致了try超时。会触发多次重试,而多次重试,就需要考虑幂等的操作。
    可以利用幂等表来先查后写,来规避重复执行的问题。

要考虑第一次的try因为网络拥塞,所以在Confirm/Cancel后才到,代码逻辑一定要严谨

  1. confirm超时
    检查业务状态,避免重复confirm,在极端情况下,两个重复请求同时到达,可以通过业务规则丢弃请求,比如已经提交了,再来个提交请求,就直接返回成功或者丢弃。

要考虑confirm因为网络拥塞,晚于cancel到达的情况

  1. cancel超时
    同上,网络拥塞与幂等依旧是实现的难题。

要考虑cancel后,confirm到达的问题。

  1. 空回滚
    Service Try还未执行,因为其它Service已经失败,所以发来了Cancel消息。
    Cancel需要清理无效资源,而资源未创建,如果代码不够健壮,就会报错。
  2. 事务悬挂
    Cancel 或 Confirm 已执行后,因为拥塞而迟到的 Try 请求到达。
    Try阶段需要检查事务是否已经结束,否则拒绝执行或忽略

可以看到,自己实现TCC是一件很麻烦的事情。这对于研发来说简直就是一种灾难。
所以TCC一般都会搭配一张幂等表,来作为状态标记,辅助判断重试中过程中的各种情况。

分布式事务Id 事务描述 事务状态 主键Id
68402338-ec9d-489c-ba07-abb42546329d 订单创建 ACK xxxx
b70240b8-17ce-4005-b322-e9b886d41e4b 库存扣减 Try xxxx
2bdd077c-d221-49ce-a7d4-6f441dec1928 金额预扣款 Cancel xxxx

最终一致性事务

无论是基于2PC/3PC还是TCC的解决方案,核心都是基于XA协议的思路。事务参与者创建本地事务,由协调者协调最终的事务提交还是回滚。
上述的方案中,创建本地事务终究需要排他等待(强一致性),无论你如何优化都是无法避免的,因为这是CAP定理的桎梏。
这些全局事务方案由于操作麻烦,排他等待等因素,此类架构的架构是保证了强一致性,所以并发度不会高。
面对互联网主流的AP架构,演化出了与XA协议背道而驰的最终一致性解决方案

image

  1. Order Service
    开启一个本地事务,同时提交业务数据,扣减库存数据+预付款数据。保证强一致性。

  2. 独立轮询服务捞数据
    由于网络原因,Order Serivce发送给MQ的消息可能会丢。因此需要一个服务一直扫描未发送的数据

  3. Inventory Service/Payment Service
    收到MQ消息后,首先是幂等性校验,与TCC类似,本来会有一张幂等表来辅助实现接口幂等。
    并在同一个事务中,更新业务逻辑与幂等状态。
    如果处理失败,不会返回ACK,所以MQ会不断重试。
    如果是业务失败,同Order Service流程,回滚自己的事务同时,向Msg表发送Cancel 扣减库存数据+预付款数据。实现分布式事务回滚。

FAQ

  1. 独立的轮询服务挂了
    多部署几个实例,集群化。
    要万一挂了,因为本地Msg表状态还是未发送,所以再重新发一次就好

  2. MQ挂了?
    Msg是持久化在数据库中,所以消息并不会丢。如果长时间挂,再人工介入。

  3. 消费端挂了?
    基于MQ的ACK机制,如果处理失败,MQ会不断重试,直到触发阈值,人工介入。

  4. 消费端幂等性?
    每个服务都有自己的消息消费记录表,记录下处理过的MQ MessageId 先查后写。或者利用主键等本身能证明唯一性的数据,防止重复处理。

  5. 死循环消费
    因为代码问题,导致的永远不会消费成功,可以在消息表中设计最大重试次数,或者挪到死信队列中,人工介入。

  6. 本地消息表过大,影响性能
    随着写入量的增加,表的大小日积月累。这就是数据库单表优化的思路了,归档,分表等常规操作

回归正题,为什么我讨厌分布式事务

分布式事务的本质是 “妥协的艺术”,为了解决一个问题,从而引发出更多的问题。

使命召唤游戏里有一句经典台词,扑灭一场火最好的办法,是在旁边点燃一团更大的火,烧光它的可燃物,耗尽它的氧气,火自然就灭了。

不管是强一致性的2PC/3PC/TCC,还是最终一致性的本地消息表/消息队列。他们都会引入一些更麻烦的操作来实现,
比如2PC/3PC依赖DTC,TCC依赖程序员自身的素养,性能低的同时开发跟维护成本高。
最终一致性的方案也好不到哪里去,超时重试(避免因短暂延迟导致事务失败),幂等性(避免重复操作导致数据错误),补偿冲突(如多个补偿操作同时执行,需加锁或版本控制),都是分布式系统的必须处理的部分

总结:分布式事务是 “最后的手段”,能通过业务规避就尽量规避,仅在 “数据绝对不能错”(如金融)或 “资源绝对不能冲突”(如航空订票)的场景中使用。

说人话就是,我只想早点下班,分布式事务太麻烦了。各位的项目没到那个体量就别给自己找麻烦。

posted @ 2025-08-04 12:12  叫我安不理  阅读(3145)  评论(8)    收藏  举报
drgs付费是什么意思 静脉曲张看什么科 6月12日是什么日子 4.28什么星座 肥牛是什么肉
骑马挥杆是什么牌子 腰两侧疼痛是什么原因 胃疼挂什么科室 嗜酸性粒细胞偏低是什么原因 张信哲为什么不结婚
肺痨是什么病 一个叉念什么 宫外孕有什么危害 地奥司明片治疗什么病 子宫内膜异位是什么原因造成的
西昌火把节是什么时候 宝宝细菌感染吃什么药 扭转乾坤什么意思 日加立念什么 鸡属相和什么属相最配
女儿是小棉袄儿子是什么hcv7jop7ns3r.cn kingtis手表什么牌的hcv8jop4ns1r.cn 为什么润月aiwuzhiyu.com 九月23日是什么星座hcv9jop2ns4r.cn jps是什么意思xinjiangjialails.com
3月5日是什么星座的hcv8jop4ns6r.cn 11月份是什么星座hcv8jop5ns7r.cn 哪吒他妈叫什么名字bysq.com 常务理事是什么职位96micro.com 菊花长什么样dajiketang.com
人流后吃什么hcv8jop3ns9r.cn 开字五行属什么xinjiangjialails.com 绿加红是什么颜色zsyouku.com 金刚钻是什么意思jinxinzhichuang.com 打饱嗝是什么原因造成的hcv8jop0ns0r.cn
猴戏是什么意思tiangongnft.com qn医学上是什么意思hcv7jop4ns8r.cn 南京为什么叫金陵hcv8jop5ns2r.cn 肝属什么chuanglingweilai.com 什么是穿刺检查96micro.com
百度