写点什么

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

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

关注

评论

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

NGINX社区线下Meetup第三期成功举办 感受成都开发者们的NGINX热情

爱极客侠

【云厂商】部分知名云服务商名单

行云管家

云计算 公有云 云服务 私有云 云厂商

CODING 携手 CoDesign:让设计与开发更简单

CODING DevOps

DevOps 设计 开发工具 CoDesign

一种Vue应用程序错误/异常处理机制

devpoint

Vue 异常处理 vue2 7月日更

掌握这些核心算法,拿不到10+个offer你来找我,我锤飞你个不争气的

北游学Java

Java 算法

为什么双赞安卓ARM工控主板应用前景那么好?

双赞工控

15年前的3篇论文,变成了万亿大生意

百度大脑

人工智能 论文

2021年FiL最新消息:fil值得投资吗?

区块链 IPFS fil fil矿机 fil行情

如何下载YouTube视频/影片(4K画质)

资源君

分享 经验分享 youtube视频下载 工具分享 教程分享

《面试八股文》之 Redis 16卷

moon聊技术

redis 面试

关于体验设计的十大重要定律

石云升

读书笔记 用户体验 商业洞察 7月日更 体验设计

学生管理系统详细架构设计文档

张文龙

#架构实战营

Go 语言的信号式抢占原理

Xargin

后端 Go 语言 系统编程

Baetyl邀你来战EdgeX中国挑战赛!

百度开发者中心

人工智能 最佳实践 物联网

Tensorflow for Java + Spark-Scala分布式机器学习计算框架的应用实践

Qunar技术沙龙

机器学习 tensorflow spark 后端 分布式计算

"开放数据,蔚然成林"—浪潮助力多地获得数据开放全国标杆

云计算

spring,springboot,底层原理解析

java小李

程序员小哥月入5万,却被丈母娘拒绝,丈母娘一番话让小哥很尴尬

别人都在谈爱琴海,凭什么程序员就“地中海”网友:还是太优秀!

2021- iOS开发者一份你一定会被问到的面试题(附参考答案)

iOSer

ios 面试 ios开发 iOS 知识体系

时序数据库助力安全监控

greatersecurity

粉了!京东商城核心亿级流量并发Java系统架构设计方案手册

Java架构追梦

Java 架构 面试 高并发 京东

加码物联网安全,熵核科技做终端安全的守护者

熵核科技

应届女生美团Java岗4面,一次性斩offfer,我受到了万点暴击

编程菌

程序员 面试 后端 计算机

程序员崩溃的40个瞬间!最后一个是你意想不到的.....

网络攻防学习笔记 Day86

穿过生命散发芬芳

网络攻防 7月日更

详细架构设计文档

刘丽

模块三作业

king

PancakeSwap交易所做市机器人|交易所画K线机器人

Geek_23f0c3

交易所机器人 pancakeswap 做市机器人

程序员面试时自称字节跳动工作两年,被发现学历造假,结果蒙了!

Java版人脸检测详解上篇:运行环境的Docker镜像(CentOS+JDK+OpenCV)

编程菌

Java 编程 程序员 后端 java技术宅

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