NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

牺牲一致性来换取分布式架构的可伸缩性

  • 2008-03-11
  • 本文字数:2233 字

    阅读完需:约 7 分钟

系统架构师角色关键的一方面就是衡量相互冲突的需求、决定解决方案,常常要牺牲一个方面来换取另一个方面。随着系统变得越来越大、越来越复杂,越来越多关于如何构建应用的传统智慧正在受到挑战。比如说,去年 3 月在伦敦召开的 QCon 会议上,Dan Pritchard 谈论了 eBay 的架构。他的介绍随后得到了很多的报道,其中一个主要的结论就是 eBay 不使用事务,用数据一致性上的损失来换取系统整体伸缩性和性能上相当大的改进。

InfoQ 接着 Dan Pritchard 在 QCon 会议上的谈话与他继续讨论,以获得更多信息:

为什么 eBay 不使用事务,或者为什么可以决定不采取应用级事务?

我们并非一概不使用事务。我们只是不使用跨物理资源的事务,因为它会造成多个组件之间出现依赖。组件可以是应用服务器和数据库。(例如在客户端控制的事务中,)一个客户端的失败会长久地阻塞数据库资源、超出我们的忍受程度。我们也不使用分布式事务,因为让应用依赖于多个数据库会降低客户端实际的可用性。相反,我们选择缺少事务的设计,并加入失效模式,失效模式可以使客户端甚至在发生数据库可用性问题的时候也能继续进行。

应用级事务总是有些问题。只要让开发人员管理资源的生命周期,就少不了因管理出错而引起的 Bug。事务管理和内存管理比起来没有多大的不同,而且我们看到由于生命周期问题,语言的总体趋势是不再让开发人员负责内存管理。假设 Bean 后面的每个数据库操作都是同等重要的,那么声明性事务(就像 EJB 中的那些)就是一个简化事务管理的强有力的方法。

是否采用事务真正取决于你的伸缩性和可用性目标。如果你的应用需要达到每秒数百笔事务,你会发现分布式事务达不到这一目标。如果你想使可用性超过 99.9%,那么你根本不能想当然地假设所有的数据库提交都能在 Web 页面的上下文中完成。遗憾的是,对于何时应当放弃应用级事务并没有简单的规则。相反,做为一名架构师,你必须决定什么时候应当为了满足系统的一个制约因素的要求而放松对另一个制约因素的要求。

你是怎样为像“出价竞拍”这样的操作实现原子性的?

出价竞拍本身就是一个很有意思的问题,原子性并不是重点,更多的是关系到在拍卖关键的最后几秒钟里不要阻塞任何出价人。如果改成在显示时刻而不是在出价时刻计算最高出价人和最高出价,就会变得非常简单。所有出价都被插入到一个单独的子表,插入操作不太会引起资源争用的情况。每次显示产品的时候,再重新取回所有的出价,并且在这个时候应用业务逻辑来决定最高的出价人。

你的问题背后隐藏的真正问题是我们如何实现一致性?要在大型系统中实现一致性,你必须放弃 ACID,转而使用 BASE:

基本可用(Basically Available)
软状态(Soft state)
最终一致(Eventually consistent)

如果你能够在每个客户端请求快结束的时候放松对数据一致的要求,就有可能消除分布式事务,并使用其它机制来达成一致的状态。举例来说,在上面的出价案例中,我们也更新视图数据表,视图数据表是按照出价人来组织数据的,目的是加速“我的 eBay”页面的显示。这里用两个异步事件来完成。一个是依靠内存中的队列,因为我们希望尽量缩短从出价到在显示在“我的 eBay”页面上之间的响应时间。但是,内存中的队列不可靠,所以在发生出价操作的时候,我们同时用一个服务器端事务来捕获出价事件。即使内存中队列的操作失败了,这个出价事件也能根据还原机制被处理。出价人视图数据表因此而解耦,但不总是与出价表的状态保持一致。不过这是我们可以接受的让步,它让出价表和出价视图表之间不必服从 ACID 要求。

对其它大型系统的架构,你有什么建议吗?

最简单的建议就是,给一个为小规模应用而设计的架构增加资源并不能让它变成大规模的架构。你必须打破常规模式,比如 ACID 和分布式事务。乐于寻找机会放松一些约束,即使传统上认为是不能放松的。

还有两条简单的原则:把每样东西都设计成分离的;考虑 BASE、而不是 ACID。

亚马逊 CTO Werner Vogels也在QCon 发了言,他通过引用Eric Brewer 的CAP 定理提供了一些权衡取舍更深层的背景。这个定理曾在 2000 年 PODC 会议上(.pdf 文件)进行过介绍,介绍中也包括 ACID vs. BASE 的内容。它陈述了对于数据共享系统的三项属性——数据一致性、系统可用性、对网络分区的耐受性——在同一时间只能达成其中的两项。换句话说,一个不能容忍网络分区的系统可以利用像事务这样普通的技术来实现一致性和可用性。然而,像亚马逊和 eBay 这样的大型分布式系统,网络分区是既定的。它的后果就是,大型分布式系统的架构必须决定时放松对一致性的要求,还是放松对可用性的要求。两种选择都会给开发人员造成一些负担,他们需要了解他们处理的架构的特点。比如说,如果你选择放松一致性要求,那么开发人员就要决定怎样处理这种情形——对系统的写入不会立即反映到对应的读出中。就像 Windows Live 项目经理 Dare Obasanjo 在他的博客中写的一样。

我们在 Windows Live 平台的某些方面也采用了类似的做法。我也听到了开发人员抱怨一件事情,就是原先能通过事务轻松获得的错误恢复,现在要留给应用开发人员来处理。最大的苦恼往往是关于回滚复杂的批处理操作。

许多大型网站似乎都殊途同归,得到了同样的结论。观察到这一点是很有意思的。虽然只有几个节点的小型系统尚不需要关注这些形形色色的权衡取舍,但是 eBay 和亚马逊正在处理的各种问题可能已经开始在企业系统中出现了,因为这些企业系统的用户规模也正变得越来越大。

查看英文原文: Trading Consistency for Scalability in Distributed Architectures

2008-03-11 19:305963
用户头像

发布了 151 篇内容, 共 60.1 次阅读, 收获喜欢 18 次。

关注

评论

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

恒源云(GPUSHARE)_CV领域有关【直方图】的论文小记

恒源云

深度学习 CV

MASA Framework - 整体设计思路

MASA技术团队

C# .net 框架 Framework dapr

数据库审计设备选择哪家好?谁能告知?

行云管家

数据库 服务器 数据库审计

【分布式技术专题】「Zookeeper系列」为大家介绍一下 Zookeeper 的"开发伴侣"—Curator-Framework(组件篇)

洛神灬殇

zookeeper ZooKeeper原理 1月月更 Curator-Framework

12月发布两大特别专区!一图了解龙蜥社区大事件

OpenAnolis小助手

开源 操作系统 运营

【有奖评测】无影云电脑评测征集令,晒出评测赢万元豪礼

阿里云弹性计算

阿里云 无影云电脑 征文活动

星环科技AIoT平台让工业制造设备更智能、更耐用

星环科技

如何高效上架HarmonyOS原子化服务?这个平台帮你搞定!

HarmonyOS开发者

HarmonyOS

阿里云视频云vPaaS低代码音视频工厂:极速智造,万象空间

阿里云视频云

音视频 低代码 视频云 视频开发

使用 Visual Studio Code 编写和激活 ABAP 代码

Jerry Wang

vscode abap 1月月更 vs-code

大数据开发之Spark SQL 的 Catalyst介绍

@零度

大数据 spark SQL

深度解读企业云上办公利器「无影云电脑」

阿里云弹性计算

阿里云 无影云电脑

【数据库】查询优化之子连接优化

恒生LIGHT云社区

数据库 sql SQL子查询 子查询

Android技术分享| Android WebRTC 对 AudioRecord 的使用

anyRTC开发者

android 音视频 WebRTC 移动开发 AudioRecord

澳鹏中国智能可配置工作流(Workflow 2.0)全新升级

澳鹏Appen

人工智能 工作流 workflow 数据标注 训练数据

盘点 2022 云原生实战峰会重磅发布

阿里巴巴云原生

阿里云 开源 容器 云原生

今儿新学会一个写日志技能:双缓冲机制

华为云开发者联盟

线程 日志 应用程序 双缓冲区 Web程序

rosdep update遇到ERROR: error loading sources list: The read operation timed out问题

Ayosh

ROS

为企业选择合适的CRM系统的技巧

低代码小观

CRM 客户关系管理 CRM系统 客户关系管理系统 企业管理软件

复旦大学陈平博士:网络攻击猖獗,如何应对数据安全与内生安全挑战?

星环科技

网络安全

大数据实践:数据指标中心的建设思路

五分钟学大数据

大数据 1月月更

人员流动大,简历管理纷杂怎么办?用低代码可以解决嘛?

优秀

低代码

极客星球 | MobPush之FCM离线消息解密

MobTech袤博科技

FCM 离线消息

网易云信又双叒受到Gartner关注,看看这次的报告说了什么?

网易云信

Gartner 通信平台 CPaaS

java开发之SpringBoot实现自动执行代码

@零度

JAVA开发 springboot

Apache 基金会年度报告 | ShardingSphere 代码提交量位列前十

SphereEx

数据库 开源 基金会 ShardingSphere SphereEx

【分布式技术专题】「Zookeeper系列」为大家介绍一下Zookeeper的"开发伴侣"—Curator-Framework(基础篇)

洛神灬殇

zookeeper curator 1月月更 CuratorFramework

【堡垒机】2022年企业买堡垒机就选行云管家!五大优点看这里!

行云管家

等保 堡垒机 过等保 等保2.0

阿里云消息队列 2021 新功能新特性重要里程碑

阿里巴巴云原生

kafka 阿里云 RocketMQ 云原生 消息队列

有关 TiDB 升级的二三事——教你如何快乐升级

PingCAP

main函数你到底知道多少

恒生LIGHT云社区

后端 开发 Java’ main方法

牺牲一致性来换取分布式架构的可伸缩性_架构_Floyd Marinescu_InfoQ精选文章