您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

我误解了分布式系统中的可伸缩性

时间:2022-12-09 18:03:13  来源:今日头条  作者:科技狠活与软件技术

系统是否可扩展?回答这个问题似乎很简单。但我们大多弄错了。不再了。阅读更多以找出答案。

“应用程序可扩展吗?” 经理问。每周的系统路线图会议几乎进行了一半。我以为我们已经完成了所有技术部分,很快就会转向与业务相关的问题。

我团队的架构师清了清嗓子回答说:“它可以轻松处理两倍于通常的负载。”

经理看了很久,一副不相信这个答案的样子。但是,在没有任何更好的观点的情况下,他继续进行进一步的更新。我含蓄地相信我们的系统确实是可扩展的。毕竟,建筑师已经明确地宣布过了。

一年下来,我知道了真相。一个晴天,系统因负载过大而崩溃。

该银行为假期推出了一种新的贷款产品。商业战略得到了回报,需求激增。由于我们的应用程序提供了做出信用决策的核心数据,因此它被来自其他几个应用程序的传入请求淹没了 5 倍。

我们添加了更多 CPU 来处理我们服务的负载。同样的策略在最近几次都奏效了。然而,这次没有。

我们的系统是可扩展的,直到它不再是。

经过分析,我们发现问题并不完全出在我们的应用程序代码中。我们的应用程序由与银行中央数据库相连的多项服务组成。与数据库的连接是使用连接池建立的。

我们的错误是我们对打开的连接数粗心大意。事实证明,数据库管理不是。

DBA 对我们应用程序组的打开连接数有一个严格的限制。当对我们应用程序的传入请求激增时,我们最终获得了更多的连接,直到我们碰壁。无论我们添加多少额外的 CPU 来增加应用程序容量,都没有任何区别。

雪上加霜的是,DBA 拒绝增加允许的连接数。剩下的唯一选择是对我们的应用程序进行代价高昂的更改以正确处理连接。出于所有实际目的,我们的系统不再具有可扩展性

当然,这是我们的错误。我们应该考虑到有限的连接数并明智地使用它们。尽管如此,问题并非无法解决。但这种改变并不划算

虽然情况最终得到了处理,但它激起了我对这个主题的兴趣。我们认为该系统是可扩展的。但事实并非如此。至少在我们达到连接限制之前不会。

很明显,我们对可伸缩性的真正含义的理解是错误的。我决定深入了解整个情况。我最初的动机是避免陷入与我团队的架构师相同的境地

系统可扩展性的通常定义

可扩展性是构建分布式系统的基本挑战之一。

在研究分布式系统的可伸缩性时,我遇到的最常见的定义如下:

可伸缩性是系统处理增加的工作负载的能力。

这个定义在现实生活中如何应用?

活跃使用的系统的开发人员监控其工作负载水平。他们创建流程来预测系统性能何时会变得不尽如人意。目标是在达到危险级别之前增加系统的容量。

在这种可扩展性方法中,主要关注点是确定一个需求区间,在该区间内系统将以可接受的水平执行。如果这个间隔足够大,则系统被认为是可扩展的。

在我看来,这个定义非常有限。此定义的重点始终是工作负载。

该定义的主要关注点是,如果系统随着工作负载的增长继续充分执行,则该系统是可扩展的。没有注意必须如何修改系统才能将性能保持在同一水平。

正如我们在案例中发现的那样,我们的系统本可以继续保持良好的性能。但是数据库端所需的更改是不可接受的。更改代码也不符合成本效益。

通用的可伸缩性定义不关注容量增加的方法或其对系统的整体影响。我们不会问重要的问题,例如:

  • 处理器数量加倍是否能让系统处理双倍的工作负载?
  • 处理器之间协调工作的开销是否会过高?

为了捍卫定义,它是系统设计人员和开发人员使用的最常见的定义。我们总是听到有人说系统是可扩展的,它可以毫无问题地处理双倍的工作负载。

扩展的可扩展性

在寻求了解可伸缩性的过程中,我遇到了另一种经常被忽视的可伸缩性定义。但是,我开始相信它在实际情况中可能更为重要。

可伸缩性是通过重复应用具有成本效益的策略来扩展系统容量来处理增加的工作负载的能力。

重点立即转移到增加容量的策略上。

我们不再对一次性增加容量以提高可扩展性感兴趣。我们感兴趣的是增加容量的策略以及可以经济高效地应用该策略的次数

这种思路总是让我想起像拉斐尔纳达尔或罗杰费德勒这样的世界级网球运动员。多年来,像纳达尔或费德勒这样的球员有多少次调整他们的比赛风格以适应不断变化的比赛需求?

很多次,我想。

他们所做的每一次改变都延长了他们的职业生涯并使他们更加成功。

然而,做出改变并不容易。许多玩家升到顶峰后就因为无法适应而失败。即使是最好的球员也必然会在尝试适应时遇到困难。球员越容易做出改变,他在比赛中保持统治地位的可能性就越大。

扩展系统也是如此。

当我们考虑可伸缩性的第二个定义时,我们开始考虑关于我们系统的其他类型的争论。

  • 如果我们添加更多的处理器来增加容量,那么在添加的处理器之间协调工作的方法是什么?
  • 协调方式会不会占用更多的处理周期?
  • 如果是,将无法实现增加容量的全部好处。因此,添加超过某个点的处理器可能不是一种提高可扩展性的经济有效的方法。

专注于扩展策略的重复应用可以让我们更加了解我们的选择

例如,将O(n^2)替换为O(nlogn)算法可以在相同的时间内处理更大的工作负载。换句话说,用更高效的算法替换算法可以提高系统的可扩展性。

但是我们可以重复使用这种方法吗?我不这么认为。

一旦我们有了最有效的算法,算法替换策略就不再可行了。您不能不断地应用该策略来提高系统的可扩展性。

系统是否可扩展?

有了可伸缩性的两个定义,我终于能够理解这个基本问题。这是我们会议中突然出现的同一个问题,但没有得到充分回答。

为了回答这个问题,我们最终将系统标记为可扩展或不可扩展。在我看来,这是过于简单化了。

系统可扩展意味着什么?

大多数系统在某种意义上都可以扩展。但是,没有任何系统可以无限扩展。

那么我们应该如何处理可扩展性呢?

理论方法

比起给系统贴标签,比较两个不同系统的可扩展性更有收获。考虑下图,它显示了两个假设系统 A 和 B 的响应与需求曲线。

对于任何给定的需求水平,与系统 B 相比,系统 A 的响应更差。如果存在响应的最大容忍值,系统 A 将比系统 B 更早达到该值。

系统 B 比系统 A 更具可扩展性。

当然,如果两条线继续以相同的单调速率上升,它们最终将达到对资源的需求超过其可用性的点。到那时,两个系统的响应时间都将变得不尽如人意。尽管 A 和 B 的分数可能不同,但它们表示系统可扩展性的限制。

请记住 - 没有任何系统可以无限扩展。

系统不遵循响应与需求指标的单调增长率。曲线看起来更像下面的例子。

假设的系统可以很好地容忍需求增加,直到它达到一个重要的设计限制。这种限制在响应需求曲线中形成了类似膝盖的形状。在超过特定需求水平后,响应指标就会失控。

设计师的目标是使曲线的拐点尽可能靠右。一旦系统接近膝盖,它就不再具有可扩展性。需求的任何增加都会将其推下山坡。

实用方法

可扩展性的理论方面让我大开眼界。但我还是觉得少了什么。

我无法将上述图表与我们的系统完全联系起来。每当负载普遍增加时,我们都能够在最初几天成功地扩展我们的系统。只有当我们达到数据库限制时,事情才会变得糟糕。

这种行为不符合描述可伸缩性的两个理论模型中的任何一个。

如何对这种行为进行分类

大多数真实系统表现出更多的混合行为。下图显示了这一点:

当系统在底部绿色区域运行时,它响应良好。当它开始在中间区域徘徊(以黄色显示)时,响应开始变得不可接受。当它最终进入顶部区域(以红色显示)时,系统变得不可用

在我看来,这是对可扩展性的第二个定义的更准确的表述。

  • 在前几次,系统设计人员能够迅速采取行动将响应保持在可接受的范围内。这可能是添加额外内存的问题。
  • 第三次,设计人员需要更多的时间和精力来将响应指标降低到可接受的水平。改善响应所需的更改可能更复杂。
  • 在最后一种情况下,系统已达到无法合理解决方案以防止响应时间变得不可用的程度。使用最初几次有效的成本效益技术,该系统不再可扩展。

上述事件也描述了我们系统的情况。尽管我们能够在一段时间内保持系统的可扩展性,但它最终达到了一个临界点,超过这个临界点,任何具有成本效益的解决方案都不可能实现。

那么,系统是否可扩展?

答案是——视情况而定!而不是以一种逃避的方式。

可扩展性更像是一个不断发展的移动目标,而不是一个固定的状态。

如果系统所有者有能力继续投入资金以满足更高的需求水平,则系统可以扩展到一定程度。除此之外,没有任何具有成本效益的行动可以缓解响应指标问题。

如果系统所有者在一开始就没有钱购买额外的资源,那么系统是不可扩展的

无论如何,没有任何系统是可以无限扩展的。

结语

我理解可伸缩性真正含义的旅程得出了一些重要的结论。

在我看来,您不能简单地在系统上贴上可扩展性的标签,然后就此结束。

所有系统在某种程度上都是可扩展的。但这并不意味着您可以以具有成本效益的方式无限期地继续扩展它们。

理想的可扩展性情况需要采用细致入微的系统设计方法。只关注增加资源以提高可扩展性是一个陷阱。您还需要考虑额外资源的成本效益。

通过这篇文章,我的目标是将这种观点带入讨论。

请在下面的评论部分分享您的想法。



Tags:分布式   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Search: 分布式  点击:(2)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: 分布式  点击:(49)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: 分布式  点击:(40)  评论:(0)  加入收藏
雪花算法详解与Java实现:分布式唯一ID生成原理
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳...【详细内容】
2024-02-03  Search: 分布式  点击:(51)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  Search: 分布式  点击:(59)  评论:(0)  加入收藏
分布式事务框架选择与实践
分布式事务是处理跨多个服务的原子操作的关键概念,而选择适合应用场景的框架对于确保事务一致性至关重要。以下是几个常见的分布式事务框架,并讨论它们的使用和实践。1. XA协...【详细内容】
2024-01-05  Search: 分布式  点击:(96)  评论:(0)  加入收藏
分布式场景下的事务机制
事务消息是RocketMQ的一个非常特色的高级特性,它的基础诉求是通过RocketMQ的事务机制,来保证上下游的数据⼀致性。我们在单机版本下面只需要在业务方法上加上对应的事务就可以...【详细内容】
2023-12-26  Search: 分布式  点击:(124)  评论:(0)  加入收藏
分布式存储系统在大数据处理中扮演着怎样的角色?
如果存储节点本身可以定制,则通常会让其支持部分计算能力,以利用数据的亲和性,将部分计算下推到相关的存储节点上。如果存储是云上的 S3 等对象存储,无法定制,则通常会将数据在计...【详细内容】
2023-12-19  Search: 分布式  点击:(48)  评论:(0)  加入收藏
MongoDB与大数据处理:构建高性能分布式数据库
MongoDB是一种非关系型数据库,具有高度灵活性和可扩展性。在处理大量数据时,索引的优化是提升查询性能的关键。下面将介绍一些MongoDB索引优化的指南,帮助用户更好地利用索引来...【详细内容】
2023-12-18  Search: 分布式  点击:(72)  评论:(0)  加入收藏
聊一聊雪花算法与分布式ID生成
生成全局唯一ID的雪花算法原理雪花算法是一种用于生成全局唯一ID的算法,最初由Twitter开发,用于解决分布式系统中生成ID的问题。其核心思想是将一个64位的长整型ID划分成多个...【详细内容】
2023-12-12  Search: 分布式  点击:(138)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条