ACID 过时?用 Sagas 搞定数据一致性,2024年是意义非凡的一年

大大有名

POJO‘s in action

Microservice Patterns

微服务enable 持续部署

架构、组织和过程三角

架构:微服务架构

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

过程:持续交付/部署

services = testability  and deployability

松耦合,数据封装

如何维护数据一致性呢?

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

2PC 不是一个好的选择

//

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

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

3、锁导致吞吐量降低

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

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

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

sagas 可以追溯到1987年的论文

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

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

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

学习分享,共勉

这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!

资料整理不易,读者朋友可以转发分享下!

Java核心知识体系笔记.pdf

记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经

中高级Java开发面试高频考点题笔记300道.pdf

记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经

架构进阶面试专题及架构学习笔记脑图

记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经

Java架构进阶学习视频分享

并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!**

资料整理不易,读者朋友可以转发分享下!

Java核心知识体系笔记.pdf

[外链图片转存中…(img-fUgQI0zS-1711043132005)]

中高级Java开发面试高频考点题笔记300道.pdf

[外链图片转存中…(img-iHXXoi6h-1711043132005)]

架构进阶面试专题及架构学习笔记脑图

[外链图片转存中…(img-UxncGVfp-1711043132006)]

Java架构进阶学习视频分享

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值