在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

使用 Saga 实现微服务中的数据一致性

  • 2018-02-26
  • 本文字数:1261 字

    阅读完需:约 4 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

在 QCon 2017 旧金山大会上,软件架构师 Chris Richardson做演讲介绍了微服务中的数据一致性技术。演讲主要提出了一种称为“Saga 模式”的方法,它将一个分布式事务划分一组较小的事务,所划分的事务或者全部提交,或者全部回滚。

演讲的要点包括:

  • 单个微服务可以确保符合 ACID,因为每个微服务都具有自己的数据库。
  • 要在微服务架构中实现分布式事务,可以考虑采用 Saga 模式。它将一个事务划分成一组较小的事务,事务间通过消息传递连接在一起,所有事务必须全部完成,或全部回滚。
  • Saga 模式并不提供隔离性保证,这意味着必须对异常情况采取一定的措施。
  • 为了保证 Saga 提交或回滚,应组合使用事务日志结尾和消息传递。

Richardson 指出,微服务体系结构中的每个微服务,都应该具有不能被其它微服务直接访问的专用数据库。

这种架构虽然实现了松耦合,但是 Richardson 指出,它同时也引入了数据一致性的问题。“我们应该如何实现跨多个微服务的事务?”

为解决数据一致性问题,Richardson 提出了一种 Saga 模式。其核心理念是避免使用长期持有锁(例如两阶段提交)的长事务,而应将事务切分为一组按序依次提交的短事务。Saga 满足 ACD 特性:

  • 原子性:所有的事务或者全部执行,或者全部补偿。
  • 一致性:本地数据库和应用代码都提供参照完整性。
  • 持久性:由消息代理和数据库提供保证。

虽然 Saga 的特性接近于 ACID ,但仍不满足隔离性。这意味着 Saga 可从未完成的事务中读取和写入数据,从而引入了各种隔离异常。为了解决这个问题,Richardson 列出了多种对策。包括使 Saga 中事务可交换,甚至是使用版本文件支持事务以任何顺序发生。

Richardson 还展示了回滚将面对更大的挑战,因为回滚不再是无代价的,正如在符合 ACID 的数据库中那样。回滚必须在应用代码中实现。最重要的是,当同步 API 请求触发异步 Saga 时,必须决定何时给出响应。是否应该阻止响应直至 Saga 完成,还是应立即返回并由用户通知?Richardson 推荐后者,因为后者提高了可用性,也因为大多数 UI 可以隐藏来自用户的异步性。

理查德森还介绍了 Saga 的两种协调方式。一种称为编排(choreography),Saga 件在微服务之间异步发射。另一种称为编制(orchestration),只是一个集中的服务触发器,跟踪 Saga 中的所有步骤。Richardson 认为,编制方法具有最大的优势。它可以减少循环依赖,并且如果它是集中式的,就更容易推理一个 Saga。为了实现这一点,他介绍了 Tram,一种为 Java 编写的开源 Saga 框架。

据 Richardson 介绍,Saga 间的通信类似于正常事务,Saga 必须保证全部完成或全部回滚。由此,Richardson 认为消息传递是唯一合理由的选择方式,主要因为与 HTTP 相比,消息传递具有持久性保证。他还建议在发送消息之前,将消息写入到本地数据库,这意味着可对事务日志结尾,这样新的日志在到来后就可以发布,进一步强化了 ACD 保证。

完整的演讲可在线观看 Tram 的开源代码 tig 在 GitHub 上

查看英文原文: Data Consistency in Microservices Using Sagas

2018-02-26 18:009155
用户头像

发布了 391 篇内容, 共 158.6 次阅读, 收获喜欢 257 次。

关注

评论

发布
暂无评论
发现更多内容

MySQL进阶之道,MySql性能实战源码+笔记+项目实战

程序知音

Java MySQL 数据库 后端

使用depay信用卡开通chatGPT付费API

石云升

AI ChatGPT 三周年连更

Gartner发布中国容器管理平台供应商识别指南,灵雀云实力入选

York

容器 云原生 系统架构 研究报告 平台选型

Alibaba微服务线上架构攻略,从实战到源码精讲

程序知音

Java 微服务 SpringCloud java架构 后端技术

OpenHarmony开发者大会举办,OpenHarmony项目群授牌30家捐赠单位及个人

最新动态

微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

Bug终结者

redis缓存 三周年连更

中国边缘云公有云服务市场 Top2,百度智能云让智算无处不在

百度开发者中心

云计算 #百度智能云# 边缘云

再获殊荣!华为云GaussDB喜提“科技进步一等奖”

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发

Java你猿哥

Java spring JVM 多线程 myssql

好用的配置工具yaml | python小知识

AIWeker

Python python小知识 三周年连更

2023年,人工智能和数据训练呈现哪些新趋势?

澳鹏Appen

人工智能 机器学习 数据标注

【Linux】之如何卸载干净zabbix服务?(超详细)

A-刘晨阳

Linux zabbix 三周年连更

【重磅】针对小微企业信息安全,行云管家堡垒机隆重推出免费版

行云管家

云计算 企业上云 安全运维 运维安全

迪斯克分投趣模式挖矿分红dapp系统开发功能详情

开发v-hkkf5566

《一时重构一时爽,一直重构一直爽》

后台技术汇

代码重构 软件重构 三周年连更

如何在页面中监听“不存在”的 DOM 节点

茶无味的一天

JavaScript DOM web api 水印 MutationObserver

矢量图片转换工具:Vector Magic 免激活版

真大的脸盆

Mac Mac 软件 图片格式转换 图片格式

详解数据结构中栈的定义和操作

华为云开发者联盟

数据结构 开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

聊聊实例化需求

老张

需求分析 实例化需求

600+ 道 Java面试题及答案整理(建议收藏)

Java你猿哥

Java spring 分布式 mybatis 多线程

原生开发能不能动态化?移动端动态能力建设的流派有哪些?

没有用户名丶

景区共享电动车厂家如何找?投放前景如何

共享电单车厂家

共享电动车厂家 景区共享电单车 共享电单车投放 共享电单车生产

Qz学算法-数据结构篇(引入)

浅辄

数据结构 三周年连更

聊聊 CSS 隐藏元素的 10 种实用方法

茶无味的一天

CSS 隐藏元素

电子元器件“切开后”,原来是这样子的!

元器件秋姐

科普 三极管 元器件 二极管 电感

带你掌握数仓的作业级监控TopSQL

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

深度学习基础入门篇[六]:模型调优,学习率设置(Warm Up、loss自适应衰减等),batch size调优技巧,基于方差放缩初始化方法。

汀丶人工智能

人工智能 深度学习 学习率 warmup batchsize

详解HTTP Keep-Alive选项说明及注意事项

阿泽🧸

keep-alive 三周年连更

好用的eval | python小知识

AIWeker

Python python小知识 三周年连更

熬夜肝到秃头!阿里顶配级Spring Security笔记

程序知音

Java spring 后端 spring security java架构

如何从1到99做好产品 | 得物技术

得物技术

使用Saga实现微服务中的数据一致性_语言 & 开发_Andrew Morgan_InfoQ精选文章