周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

14 | 分布式事务之可靠消息队列

你好,我是周志明。
前面几节课,我们谈论了事务处理中的本地事务(单个服务、单个数据源)、全局事务(单个服务、多个数据源)和共享事务(多个服务、单个数据源),这一讲我们将聚焦于事务处理中最复杂的分布式事务(多个服务、多个数据源)。
在开始展开介绍之前,我想先给你强调一下,这里所说的分布式事务(Distributed Transactions),跟DTP 模型中所指的“分布式事务”的含义是不一样的:DTP 模型所指的“分布式”是相对于数据源而言的,并不涉及服务,这部分内容我们在上节课已经讨论过了;而这里的“分布式”是相对于服务而言的,它特指的是多个服务同时访问多个数据源的事务处理机制,严谨地说,它更应该被称为“在分布式服务环境下的事务处理机制”。
其实在上一讲我们就提到过,为了解决分布式事务的一致性问题,1991 年 X/Open 组织提出了一套 XA 的事务处理架构。在 2000 年以前,人们还寄希望于这套事务处理架构能良好地应用在分布式环境中。不过很遗憾,这个美好的愿望今天已经被 CAP 理论彻底地击碎了。
那么,为什么会出现这种局面呢?就让我们从 CAP 与 ACID 的矛盾开始说起吧。

CAP 与 ACID 之间的矛盾

CAP 理论又叫 Brewer 理论,这是加州大学伯克利分校的埃里克 · 布鲁尔(Eric Brewer)教授,在 2000 年 7 月“ACM 分布式计算原理研讨会(PODC)”上提出的一个猜想。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

分布式事务的复杂性和挑战是当前分布式计算领域的热点问题。CAP理论和ACID原则的矛盾为分布式事务带来了挑战,强调了在分布式服务环境下事务处理机制的重要性。文章通过具体案例分析了放弃分区容错性、可用性和一致性分别会带来的问题,以及在实际应用中如何权衡取舍CAP。此外,还介绍了弱一致性和最终一致性的概念,以及柔性事务的实现方式之一——可靠消息队列。这些内容为读者提供了对分布式事务挑战和解决方案的深入了解。文章通过具体案例和技术概念的讲解,使读者能够更好地理解分布式事务的复杂性和挑战,以及在实际应用中的应对策略。文章还介绍了可靠事件队列的实现方式,通过对具体操作时序的解读,展示了如何通过持续重试来保证可靠性,同时指出了这种方式可能带来的代价。最后,鼓励读者思考XA事务在分布式环境中少应用的原因以及可靠事件队列的实现方式可能带来的代价,为读者提供了进一步思考和探讨的空间。

该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(28)

  • 最新
  • 精选
  • 蓝蓝
    用为什么 XA 事务很少在分布式环境下直接应用,会有什么代价?而这节课介绍的“可靠事件队列”的事务实现方式又会有什么代价? 请老师指教,如果有错误请帮忙指正,谢谢 xa事务是全局事务,表示一个服务多个数据源,追求强一致性,复杂度高,吞吐量低。 可靠事件队列,代价是无法实时的一致性,即强一致性,而是实现了最终一致性,如果因为异常,而延迟了一致性的实现,可能会导致事物的隔离无法实现

    作者回复: 对的

    2021-01-04
    25
  • Jxin
    1.性能和一致性问题。普适性这个倒不是问题,毕竟考虑db切换大部分时候都是一种过度设计。 2.增加了复杂性(引入中间件,要考虑幂等)。失去强一致性(个别场景不适用)。 3.对于分布式事务,在真实工作中,有一个很恶心的现象。在业务逻辑中完全不考虑事务,然后通过外挂或对账系统来调整数据保最终一致。我个人比较讨厌这种做法,因为它让业务逻辑变得残缺(缺失一致性的语意),让功能分散(外挂系统逻辑代码找不到,找到了有时都不是一种语言)。 4.大佬后面完了可以加餐谈谈cdc和流程编排不。这两个我觉得跟分布式事务也是相关性很强的。

    作者回复: 关于问题3,在企业系统中很常见,譬如对账、冲销。这类功能在需求角度很可能是合理的,应该有相应的业务架构去满足,因为系统中的错误不仅仅来源于技术失误,由业务失误导致的错误同样是不可忽视的。 “感到讨厌”一般是源于采用业务架构层面的手段去处理技术架构层面的问题,说白了就是不去正视问题产生的真正根源,而是想些法子去补救,将就着用,这点就不太符合程序员的天生洁癖。 关于流程编排,以前SOA盛行的时候,我曾经做过挺长一段时间的BPMN,协同与编排在微服务时代中不会消失,但无可否认,近年来软件业界的主要关注点不在这个方向,这部文档中并没有涉及。

    2020-12-18
    3
    15
  • tjxcoding
    把枯燥乏味的知识讲的如此津津有味

    作者回复: 感谢认可。

    2020-12-18
    3
  • bigben
    以前的知识都是零散的,不知道这些知识点的联系,周老师的串讲,真是醍醐灌顶

    作者回复: 感谢认可

    2020-12-19
    2
  • Helios
    目前觉得消息队列挺好的,真的说不出什么缺点。 这个课为啥免费~

    作者回复: 课程免费是因为本来就来源于我写的一部开源文档。

    2021-02-02
  • 尹恒
    老师的课真的很好,不仅条理清晰,而且娓娓道来,很多概念,在老师这里才算真正理解透彻

    作者回复: 感谢认可

    2021-01-14
  • 努力呼吸
    请问周老师,当采用本地消息表处理分布式事务时。是否需要消费者确认消费完毕了再调用一个回调接口通知生产者,此时本地消息从处理中变为终态;还是说发送消息,broker返回SUCCESS即可将状态改为终态呢?

    作者回复: 是要在消费者成功完成操作后再回调通知的。 MQ的ACK消息只能代表可以开始进行最大努力交付了,不能代表事务被成功完成了。如果发送消息后,Broker返回了SUCCESS,此时可以提交本地事务,如果不是SUCCESS,应该直接回滚掉本地事务才对。

    2020-12-22
    3
  • zhanyd
    CAP理论听起来很高大上,其实很简单。 一致性(Consistency): 保证数据一定是一致的,对的 可用性(Availability):保证系统能用 分区容错性(Partition Tolerance):就算网络出了问题(分区),我也能忍 在分布式系统中,网络是肯定会出问题的,不可避免的,比如服务器挂了,程序挂了,网线被踢掉了,网络超时等等。 各个服务器原来通过网络连接,连成一片,在一个大的区域中,互相之间要同步数据,现在网络出了问题,各个服务器之间就断了联系,相互之间被隔离了,数据同步不了了,这就形成了分区。 出现了分区,我们也认了,这是网络错误,是无法避免的,所以分区容错性即P,在分布式系统中是一直存在的。 那在P存在的前提下,我们到底是选择保证:数据是对的比较重要呢(CP),还是保证系统能用比较重要呢(AP)? CP:比如A服务器的数据是要同步给B服务器的,现在网断了,A的数据传不过去了,我觉得保证数据对比较重要,如果A和B的数据对不上,后果很严重,为了保证A和B服务器的数据一致,干脆让A停止服务好了,直接给客户端返回错误信息,等网络恢复了,再上线,免得A和B的数据不一致。 AP:比如A服务器的数据是要同步给B服务器的,现在网断了,A的数据传不过去了,我觉得暂时的数据不一致没什么大关系,系统能用最重要,那我就继续让A提供服务,等网络恢复了,再同步数据到B。 CAP的问题就是网络不通的情况下,我们优先保证数据一致,还是优先保证系统可用的问题。
    2020-12-19
    1
    97
  • 葱味黑咖啡
    老师的课每一节都能给我新的感悟,这样质量上乘的课还是免费的实在太良心了
    2020-12-28
    2
    24
  • walle斌
    业务使用rocketmq 相比 kafka 更合适。。就在于 延迟消费 重试消费 并发消费 传统意义的分布式事物支持。。这些都是kafka无法原生支持的。。
    2021-11-02
    9
收起评论
显示
设置
留言
28
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部