写点什么

使用 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:009031
用户头像

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

关注

评论

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

SCADA系统架构、类型和应用

2D3D前端可视化开发

物联网 组态软件 web组态 组态编辑器 SCADA

技术分享| 快对讲视频调度功能说明

anyRTC开发者

监控 快对讲 语音对讲 视频对讲 视频回传

自动驾驶的「数据引擎」,该如何“降本”、“增效”和“精准化”?

澳鹏Appen

人工智能 自动驾驶 无人驾驶 智能驾驶 数据标注

Linux系统保存文件命令的详细介绍

源字节1号

软件开发 前端开发 后端开发 小程序开发

AI赋能音乐创作,人人都是音视频创作者

HarmonyOS SDK

HMS Core

从零开始学习Java系列之你为什么要学Java?

千锋IT教育

业务畅行海外,如何做到安全第一

火线安全

MySQL的存储引擎及常用数据类型详解

C++后台开发

MySQL 数据库 中间件 后端开发 C++开发

最佳实践|用腾讯云AI文字识别对混贴票据识别

牵着蜗牛去散步

人工智能 腾讯云 腾讯 文字识别 OCR

江西省四家等保测评机构名单详解

行云管家

江西 等保测评 等保测评机构

小令观点 | 需要留存用户的身份证照片?想清楚这三点了再做……

令牌云数字身份

身份认证 身份安全 敏感信息加密

携手!Kyligence 支持 Amazon EMR Serverless,赋能云上企业降本增效

Kyligence

数据分析 OLAP

为了进大厂!吃透了各大厂最新 3000+Java 面试题啃完面试肯定妥了

钟奕礼

Java 程序员 java面试 java编程

Java 八股文能不背吗?Java 面试都只是背答案吗?

钟奕礼

Java 程序员 java面试 java 编程

刷了三个月 leetcode 算法,顺利拿下百度、阿里等大厂的 offer

钟奕礼

Java 程序员 java面试 java编程

小令观点 | 需要留存用户的身份证照片?想清楚这三点了再做……

令牌云数字身份

数字身份 身份认证 加密技术 可信

异常检测算法分类总结(含常用开源数据集)

云智慧AIOps社区

人工智能 机器学习 深度学习 异常检测 算法模型

ElasticSearch 集群迁移最佳实践

冰心的小屋

elasticsearch

直播预告lApache Hudi 中文社区技术交流会第六弹

StarRocks

数据库

深入掌握 Fiori Elements 工作原理的前提条件:理解 Smart Field

汪子熙

前端开发 web开发 Fiori SAP UI5 11月月更

阿里云易立:以增效促降本,容器服务全面进入智能化时代

阿里巴巴云原生

阿里云 云原生 容器服务

上班干,下班学!这份 Java 面试八股文涵盖 20 多个技术点

钟奕礼

Java 程序员 java面试 java编程

想要做好代码质量,如何破局?

京东科技开发者

代码质量 系统 代码优化

百度面试被算法血虐,闭关肝完445页算法神仙笔记成功入职字节

钟奕礼

Java 程序员 java面试 java编程

中心化危机下,NFT 去中心化协议能否破局?

NFT Research

区块链 去中心化 NFT

隐语 PSI benchmark 白皮书

隐语SecretFlow

密码学 隐私计算 PSI 安全多方计算 隐语

小令观点 | 是什么让马斯克也受骗了?

令牌云数字身份

数字身份

开源大数据热力报告:StarRocks摘得数据查询与分析方向增速第一

StarRocks

数据库

云原生加速器企业维格表创始人陈霈霖:提供人人可用的数字化转型全新方案,真正驱动组织创新

阿里巴巴云原生

阿里云 云原生 维格表

【昇思生态城市行】南京站圆满举办, 昇腾携手伙伴见证多项重磅发布!

极客天地

云服务器买谁家的好?为什么?理由是什么?

行云管家

云计算 服务器 云服务器

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