写点什么

ACID 过时?用 Sagas 搞定数据一致性,面试字节跳动的 Java 工程师该怎么准备

用户头像
极客good
关注
发布于: 刚刚



Saga 的组成

  • 每个 Saga 由一系列 sub-transaction T?i?组成

  • 每个 T?i?都有对应的补偿动作 C?i?,补偿动作用于撤销 T?i?造成的结果


可以看到,和 TCC 相比,Saga 没有“预留”动作,它的 T?i?就是直接提交到库。


Saga 的执行顺序有两种:


  • T?1?, T?2?, T?3?, ..., T?n

  • T?1?, T?2?, ..., T?j?, C?j?,..., C?2?, C?1?,其中 0 < j < n


Saga 定义了两种恢复策略:


  • backward recovery,向后恢复,补偿所有已完成的事务,如果任一子事务失败。即上面提到的第二种执行顺序,其中 j 是发生错误的 sub-transaction,这种做法的效果是撤销掉之前所有成功的 sub-transation,使得整个 Saga 的执行结果撤销。

  • forward recovery,向前恢复,重试失败的事务,假设每个子事务最终都会成功。适用于必须要成功的场景,执行顺序是类似于这样的:T?1?, T?2?, ..., T?j?(失败), T?j?(重试),..., T?n?,其中 j 是发生错误的 sub-transaction。该情况下不需要 C?i?。




Sagas complicate API design (?Sagas?使?API 设计 复杂化??)


Synchronous API vs Asynchronous Saga


Request initiates the saga. When to send back the response??


Option #1: Send response when saga completes:


+ Response specifies the outcome - Reduced availability


选择一:saga 完成的时候发送响应


Option #2: Send response immediately after creating the saga


(recommended)


选择二:创建 saga 之后马上发送响应(推荐)


+ Improved availability(?提高可用性?)


- Response does not specify the outcome. Client must poll or be notified


(响应没有指定结果。必须轮询或通知 Client 端)




使用 Sagas,可能影响用户体验。


UI 界面向用户隐藏异步 API


如果需要更长的时间,?用户界面显示“处理中”弹出窗口


服务器可以将通知推送到 UI






Sagas 拥有?ACD 特性


原子性、一致性、持久性



缺失隔离性



Commutative updates


e.g. debit account can compensate for a credit account


Version file?(版本文件)


Record history of changes?(记录变化历史)


Use them to make updates commutative


e.g. record cancel reservation(记录 取消 预定) so that create/cancel = cancel/ create


Sounds suspiciously like event sourcing





![


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


](https://static001.geekbang.org/infoq/e2/e2c006fc40d2e8928dcca63254772888.jpeg)



Choreography (编排):?distributed?decision making vs.


Orchestration(协调):?centralized?decision making



方案 1:使用事件做基于编排模式的协作



优缺点:


Benefits?(?好处?)


简单,尤其使用事件溯源时


参与者松耦合


Drawbacks?(缺点)


循环依赖


领域对象过载,例如订单和客户相互知道太多


Events =??ndirect way to make something happen?to make something happen



选项 2:基于编排的 saga 协调



saga(?orchestrator??)??是一个持久性对象,跟踪?saga?的状态,以及调用参与者







这里有一个例子,开源的 saga?框架



优缺点


Benefits


Centralized coordination logic is easier to understand


Reduced coupling, e.g. Customer knows less


Reduces cyclic dependencies


Drawbacks


Risk of smart sagas directing dumb services







消息必须支持事务

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
ACID 过时?用 Sagas 搞定数据一致性,面试字节跳动的Java工程师该怎么准备