左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180928 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

46 | 弹力设计:补偿事务

业务方提供资源预留机制
业务逻辑和流程
维护和监控状态
幂等性和重试机制
启动补偿机制回滚业务流程
努力完成业务流程
补偿事务的实现
补偿机制
业务补偿的设计重点
Eventual Consistency
Soft-state
Basic Availability
持久性
隔离性
一致性
原子性
小结
业务补偿
BASE系统
ACID和BASE的差别
补偿事务
性能设计篇
管理设计篇
弹力设计篇
分布式系统设计模式

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
前面,我们说过,分布式系统有一个比较明显的问题就是,一个业务流程需要组合一组服务。这样的事情在微服务下就更为明显了,因为这需要业务上一致性的保证。也就是说,如果一个步骤失败了,那么要么回滚到以前的服务调用,要么不断重试保证所有的步骤都成功。
这里,如果需要强一致性,那在业务层上就需要使用“两阶段提交”这样的方式。但是好在我们的很多情况下并不需要这么强的一致性,而且强一致性的最佳保证基本都是在底层完成的,或是像之前说的那样 Stateful 的 Sticky Session 那样在一台机器上完成。在我们接触到的大多数业务中,其实只需要最终一致性就够了。

ACID 和 BASE

谈到这里,有必要先说一下 ACID 和 BASE 的差别。传统关系型数据库系统的事务都有 ACID 属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。下面我逐一做下解释:
原子性:整个事务中的所有操作,要么全部完成,要么全部失败,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时中间某一时刻的数据。两个事务不会发生交互。
持久性:在事务完成以后,该事务对数据库所做的更改便持久地保存在数据库之中,并不会被回滚。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了分布式系统设计中的弹性设计,重点讨论了采用“补偿事务”实现最终一致性的设计模式。文章首先对传统关系型数据库系统的事务特性ACID和分布式系统中的BASE理论进行了比较,强调了在分布式系统中为了提高性能和弹性,往往需要牺牲一些一致性来换取可用性和分区容忍性。通过网上卖书的场景为例,对比了ACID和BASE的不同玩法,强调了在分布式系统中采用BASE的设计模式可以实现更高的性能和弹性。文章指出,BASE系统允许系统在短时间内出现暂时性问题,但最终整个系统看到的数据是一致的,从而更好地应对分布式系统中的故障,实现更高的弹性。 在业务补偿的设计重点方面,文章强调了业务补偿需要努力地把一个业务流程执行完成,并在执行不下去时启动补偿机制,回滚业务流程。为实现BASE事务,需要实现补偿逻辑,因为事务可能失败,此时需要协调各方进行撤销。补偿的各个步骤可以根据具体业务来确定是串行还是并行。由于补偿事务是和业务强相关的,所以必须实现在业务逻辑里。 总的来说,本文通过对ACID和BASE的比较,以及实际场景的案例分析,阐述了在分布式系统设计中采用“补偿事务”来实现最终一致性的重要性和优势。这对于读者了解分布式系统设计模式中的弹性设计以及最终一致性的实现方式具有重要的参考意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 刘勇
    补偿一词不是很理解,为什么回滚叫补偿?

    作者回复: 回滚是补偿的子集

    2018-03-31
    3
    12
  • 林超
    期待讲解下工作流引擎的实现
    2018-03-15
    1
    29
  • mingshun
    一直觉得补偿事务很烦琐,日常实现也是尽量避免。看了这篇后,发现是没有很好地记录起始状态,总是想着通过目标状态来反推,所以总感觉实现起来很烦琐,逻辑错踪复杂。也许是重度精神洁癖导致吧!总觉得对正向目标没意义的数据都没有记录的必要甚至认为是浪费,然而顾着正向目标却忘了反向目标,而两个方向的目标都同等重要。
    2018-05-23
    12
  • 罗杰.菲の樂
    这里有一篇介绍工作流和状态机差别的文章: https://workflowengine.io/blog/workflow-engine-vs-state-machine/ When companies decide to implement a system that will help them manage business processes, their choice will probably lie between a workflow engine and a state machine. Though the behavior of the two systems seems to be quite similar, they both have a number of distinct features. Accordingly, it is necessary to analyze the pros and cons of both to decide which of the systems suits most company’s needs. In general, the major difference between a workflow engine and a state machine lies in focus. In a workflow engine, transition to the next step occurs when a previous action is completed, whilst a state machine needs an external event that will cause branching to the next activity. In other words, state machine is event driven and workflow engine is not.
    2020-07-19
    10
  • 事物补偿机制TCC(Try、Confirm、Cancel),是由2PC演变而来在业务层面去解决一致性问题的一种方案。其精髓在于定于业务执行逻辑的时候,同时实现一个抵消(补偿)正向逻辑的cancel操作,以便在异常情况下对原有操作进行回滚。其主要操作如下: *Try操作做业务检查及资源预留--一般用户框架对外暴露服务 *Confirm做业务确认操作--真正执行的逻辑操作,一般认为Try成功Confirm一定成功 *Cancel实现一个与Try相反的操作既回滚操作--TCC的精髓,为业务操作定义一个补偿的操作 (对于不了解TCC的同学可以参考下,了解大致背景后再看晧哥的文章会有更深的体会。基本可以当做TCC的最佳实践去读。)
    2020-04-22
    10
  • neohope
    皓哥, 您好!我们业务上会面临一种情况,就是跨厂商跨系统保持系统间数据同步,无论是通过代码直接操作多个数据库进行同步,还是通过让厂商提供服务来进行同步,最终要么实现效果很差,要么就同步机制弄的略复杂(比如订阅发布,厂商不配合),让计划没法推进。您这边后续有计划说一下类似情况如何处理吗? 说到库存的话,我们行业这边还有一种神奇的操作。这种操作的要求是,“你没货我理解,但是你说有货、我要了、你再说没有那就不行”。所以在我们行业,通常把库存分为实库存和用户库存。用户看到的库存永远小于实库存,由于并发量并不大,只需要用简单的事务控制,也能在很大程度上可以避免超卖。但当库存很低的情况下,代码就要用严格的事务控制,来避免超卖了,执行效率就很低,好在这样的情况很少。
    2018-06-21
    4
    6
  • Tim Zhang
    workflow用过两种 jbpmn的activiti5以及netflix的conductor。 workflow与task是两个重点
    2019-03-08
    1
    5
  • 李达
    陈老师好,有个疑问想请教: 衡量高可用一般用几个9来衡量,例如4个9的高可用是指一年的服务不可用时间不能超过53分钟,我的疑问有两个: 第一,到底怎么样定义服务不可用?例如返回业务的系统忙算不算可用?第二,直观理解,可用性应该是针对单个接口定义的,一个系统有很多接口,那么一个系统的可用性又应该怎么计算呢? 非常感谢!
    2018-03-09
    5
  • 二康
    期待耗子叔可以讲讲如何设计一个补偿框架,可以讲讲具体地实现过程和相关技术和难点。谢谢
    2018-06-19
    4
  • sam
    期待举例讲解补偿工作流引擎
    2018-07-31
    3
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部