ACID过时?用 Sagas搞定数据一致性

ACID Is So Yesterday: Maintaining Data Consistency with Sagas

Chris Richardson

Founder of Eventuate.io
Founder of the original CloudFoundry.com Author of POJOs in Action

本文素材作者  Chris Richardson,由坐馆老G先生注解

7d0f99d77c14a1dd14733bbae1ce13f0.png

讲义goal:

分布式数据管理在微服务架构下的挑战

Sagas 是一种事务模型

c4a35300a135cf932e458fe110779440.png

关于作者Chris

大大有名

POJO‘s in action

Microservice Patterns

1c36ed02a63270323c7a3f382c4d497f.png

f113fa1fac7c204f1cccf60493b3c186.png

a498ff6d6de2444c2911f711ffcfd857.png

f4c1c5dfacc1bfdab52c80f375bebd93.png

e35f853fa885fbd1e7ad71daa69df5fe.png

8665c8d14272214657398b7dbe7a6f7d.png

微服务enable 持续部署

架构、组织和过程三角

架构:微服务架构

组织:小、敏捷、自组织功能团队

过程:持续交付/部署

services = testability  and deployability

5e4b40f5f6827b91b44cbca0e7d8f24e.png

2a7d0066d6e7c13397a01bc3f1ac444b.png

10fa3e0c8968c4ad7c15a98a8416b54c.png

松耦合,数据封装

ae10465006507fe7417b9508e1fc0ec0.png

如何维护数据一致性呢?

eafcb13eee07f6b85c67c0f2c3bd4768.png

由于不在一个(本地)事务中......

af36eecabcd242980e54ffea9a76b2ce.png

2PC 不是一个好的选择

//

1、2PC事务协调器单点故障问题

2、通讯:至少有O(4n)条消息,并重试O(n^2)

3、锁导致吞吐量降低

4、许多NoSQL数据库(或消息代理)不支持

5、CAP理论 ⇒ 2PC影响可用性

eb9495db702f00345be2122dda4154bf.png

Ebay的Dan Pritchett 提出:

In partitioned databases, trading some consistency for availability can lead to dramatic improvements in scalability.

并有一个著名的Base理论。

Base: An Acid Alternative

Basically Available 

Soft state

Eventually consistent

172c3a0b5285c86021c41a0703c622ef.png

1426102786d05f1da393631f1d3dbce3.png

sagas 可以追溯到1987年的论文

1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas,讲述的是如何处理long lived transaction(长活事务)。Saga是一个长活事务可被分解成可以交错运行的子事务集合。其中每个子事务都是一个保持数据库一致性的真实事务。

3c44ce3c00e826172ad2d59435971954.png

c14a2c45ebb38bbe35141e27e67a70c1.png

17e0bd266d5f54d722f5a9428fc9fb6d.png

321648e6df6336515dce156fa2f45513.png

55baacbbbe1c17387ca7e5cb1ab4ea06.png

Saga的组成

  • 每个Saga由一系列sub-transaction Ti 组成

  • 每个Ti 都有对应的补偿动作Ci,补偿动作用于撤销Ti造成的结果

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

Saga的执行顺序有两种:

  • T1, T2, T3, ..., Tn

  • T1, T2, ..., Tj, Cj,..., C2, C1,其中0 < j < n

Saga定义了两种恢复策略:

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

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

f0a4be0521a65ef51faa5b64595c3016.png

6ee3cc7ed9259a950fbde7503495dc57.png

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端)

b12353d13abb11f77db036cf2a34665d.png

9e8e3f95c2062144a13bd2b0c2e81250.png

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

UI界面向用户隐藏异步API

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

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

11164a1d34b46b15f7b0c51355ce8cf1.png

c9f99c5c01b15cf3319d3c3c32a9f4b3.png

69b9d1f896a460bbf574787b74d98c75.png

f111dfa26e1c6776d5fe117fc0a04c95.png

Sagas 拥有 ACD 特性

原子性、一致性、持久性

9e1b0b3e3dc94dbe1ca9e91143f5f73b.png

缺失隔离性

8d22198c0a34840a30db50db4b49349c.png

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

79c0d90ac4db1258cfcdc840e4edb263.png

3c9a642ad136ca36b6636bc26c9c5a56.png

e42f4fa8b2b15a953a08f2beb733fd91.png

a81e5567753e1560ac7017e7ee80e869.png

05ce7d8bb9626149f9649ad48873ab30.png

Choreography (编排): distributed decision making vs.

Orchestration(协调): centralized decision making

cd0b70b94160117e544a8427bd0db0d6.png

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

55867bbfa86a5736bb7a58ae9f7602c5.png

优缺点:

Benefits (好处)

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

参与者松耦合

Drawbacks (缺点)

循环依赖

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

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

7df17452f7df8aa8e100ecab95fc4f94.png

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

8ed9f9a43f3fd501729955673718f30c.png

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

64392f09f18b9e2e53e3ee2f64967c04.png

fb81b1a67a86b1727ef7e7f84f7ce3e3.png

4542d8d79152cf29b3e1faa7b366a15f.png

48d1dc53e3f132ecc20782bfd37da36d.png

59698e0a162b9dadc2ef87c1d668e024.png

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

efffb5705f1bf1e8440bb748c76a055c.png

 优缺点

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

cb2116acadbc5b90f2284bdafa5ef64a.png

61122ad6b781fd38c801eeb116088cd4.png

8731114c1970b338ea6ede534450c78e.png

dc6be03f9544d647fd6b9797c809210e.png

8369b11ddd133792a141442d8e1cd360.png

消息必须支持事务

6e9f02956906b151bbf920eb0edcbb26.png

选择1:使用数据库表作为消息队列,ebay的案例

1fb20e47f1cfd7eb3b1ee6cd8abd4c32.png

05602d6de2b38d835af00b4de96680d8.png

a88f9b203d5aad914122cc1118dd448b.png

选择2: 使用事件溯源:以事件为中心的持久化

82cee712c5533e6060f4411e9c2aacb2.png

34394ebf580a79197e949692785fb5b5.png

498552305de008bf8d248c07d321c991.png

 
 
加入技术琐话粉丝群,公众号回复:技术群。
下载“100页ppt讲清楚云原生 ” ppt,公众号回复:高磊。
下载本ppt,公众号回复:sagas。

  往期推荐:

技术琐话 

以分布式设计、架构、体系思想为基础,兼论研发相关的点点滴滴,不限于代码、质量体系和研发管理。

bbebcdae6f2bdb3b6163882ab6accfae.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值