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

如何做好微服务容量规划?

时间:2023-12-07 13:45:49  来源:微信公众号  作者:二进制跳动

维护众多服务需要巨大的努力,手动操作已不再可行。以微博的动态推送功能为例,仅远程过程调用(RPC)服务就接近40种。这些服务接口的性能和需求各不相同,一些接口虽然处理请求量大,但响应迅速,称为轻量级接口;另一些接口处理的请求量较少,但响应时间较长,称为重量级接口。

例如,在微博的动态推送中,计数接口的响应时间极短,仅需2至3毫秒,而动态获取接口的响应时间则超过200毫秒。服务集群的规模差别明显,扩展所需的服务器数量也大相径庭。比如微博的A/B测试服务可能只需增加几台服务器即可应对增长,而动态推送服务可能需要增加上百台服务器。另外,在扩展服务时,还需注意服务间的相互依赖性,确保所有依赖的服务都有足够的处理能力。例如,微博的动态推送业务在扩展时不仅依赖于现有的服务器容量,还依赖于用户关系和卡片服务的容量是否充足。

容量规划系统的作用是根据各个微服务部署集群的最大容量和线上实际运行的负荷,来决定各个微服务是否需要弹性扩缩容,以及需要扩缩容多少台机器。

容量评估一般集群的容量评估都是通过线上实际压测来确定的,那么该如何进行线上压测呢?都需要注意哪些关键点呢?

1. 选择合适的压测指标

在进行性能测试时,我们通常关注两大类指标:系统指标和服务指标。系统指标包括CPU使用率、内存使用量、磁盘I/O和网络带宽等,而服务指标涉及到接口的平均响应时间、P999延迟(即99.9%的请求在这个时间内得到响应)和错误率。然而,这些指标并不总是能够准确地反映系统在负载下的表现。例如,低CPU使用率不一定意味着接口响应时间就是健康的,而高CPU使用率也不一定导致接口性能不佳。同样,服务指标如平均响应时间也可能掩盖实际问题,比如在压测中即使只有少量的请求响应时间延长,平均值也可能看起来不变。

基于我的经验,除了监控上述指标之外,还应该检查接口的慢请求比例,即超过特定响应时间阈值的请求占总请求的比例。例如,在对微博的动态推送接口进行压测时,我们关注的是响应时间超过1秒的请求的比例,如果这一比例超过1%,则应停止压测。这是因为如果99%的请求能在1秒内完成,用户体验通常不会受到太大影响。对大多数在线服务而言,保持慢请求比例在1%以下是服务质量的基本标准,因此这个指标可以作为一个有效的压测性能指标。

2. 压测获取单机的最大容量

要确定一个服务器集群能处理的最大负载,我们首先需要知道单个服务器能承受的最大负载,然后这个数值乘以集群中服务器的总数。获取单台服务器最大负载的方法通常分为两种:单机压测和集群压测。单机压测可以通过复现实际流量的日志或复制实时流量到一个服务器上来进行。而集群压测则是通过逐步减少集群中的服务器数量来增加单个服务器上的负载,从而测试每台服务器的极限。

根据我的经验,集群压测更为可靠,因为它利用真实的线上流量进行测试,可以得到更准确的单台服务器负载极限。但是,集群压测可能会对实际运行中的服务造成影响,因此通常在流量较低的时段进行。此外,为了便于及时应对可能出现的问题,这类压测一般安排在工作日进行。

在集群压测中,我们会监控慢请求的比例,并在这一比例达到1%时停止压测。此时,我们可以用停止压测时的每台服务器平均每秒查询数(QPS)作为单台服务器的最大容量指标。但是,仅仅使用QPS作为衡量标准并不总是准确的,因为它不一定能完全反映服务器的真实负载情况。例如,如果有两个服务器,其QPS相同,但一个主要处理响应时间低于100毫秒的请求,另一个处理的请求响应时间都超过50毫秒,则后者对服务器的负载更重。即使两台服务器的QPS都是100,处理更多慢请求的服务器可能已经无法处理更高的QPS,而另一台则可能还有余力。

如何做好微服务容量规划?图片

因此,一种更为精确的方法来衡量单个服务器的容量是通过对不同响应时间段的请求赋予加权值,这种方法称为区间加权。每个时间段的请求都有不同的权重,反映了它们对服务器负载的实际影响:更长的响应时间获得更高的权重。例如,响应时间在0到10毫秒之间的请求权重为1,10到50毫秒为2,50到100毫秒为4,100到200毫秒为8,200到500毫秒为16,超过500毫秒的为32。根据这种加权方法,前述两种情况下服务器的容量可以计算为第一种情况的请求(8个请求×权重1)+(50个请求×权重2)+(30个请求×权重4)+(10个请求×权重8)+(2个请求×权重16)等于340,而第二种情况下的计算为(2个请求×权重2)+(10个请求×权重4)+(50个请求×权重8)+(20个请求×权重16)+(8个请求×权重32)等于1020。通过这种方式,我们可以得到在压测终止时刻,经过区间加权计算得到的单个服务器的最大容量。

3. 实时获取集群的运行负荷

为了估算集群的总负荷,首先,我们需要通过压力测试确定单个服务器的最大处理能力。将这个数值乘以集群中服务器的数量,就能得出整个集群的最大处理能力。接下来,为了判断是否需要对集群进行扩展,关键在于准确估算当前集群的实际运行负载。

由于直接计算每个服务器的负载并将它们加总的方法在大规模集群(例如超过千台服务器)中效率低下,因此采用了一种更高效的方法。这种方法涉及收集每台服务器在不同响应时间区间的请求数量,然后将这些数据发送到一个中心处理点进行整合。在这个中心点,对同一集群中不同服务器在各个响应时间区间的请求数据进行汇总,从而得到整个集群在各个时间区间的请求分布情况。利用这些分布数据并结合区间加权的计算方法,就能有效估算出集群的整体运行负荷。

调度决策

在容量评估过程中,了解集群的最大容量与实际运行负载是关键。这两个数据点可用于形成有效的调度策略。类似于监控水库的水位,这种策略涉及实时监测集群的资源利用情况。如果集群的负载超过了预设的警戒线,类似于水库的水位过高,就需要采取措施来减轻负担,比如通过扩容或重新分配资源。

相反,如果负载低于某个阈值,像是水库水位过低,那么可以选择减少资源,以优化成本和效率。这样的方法确保集群负载始终保持在理想状态,既不过载也不闲置。通过将集群的最大容量与实际运行负荷的比值作为“水位线”,可以有效地实时监控和调整集群的运行状态。

如何做好微服务容量规划?图片

在调度决策时候,就可以根据水位线来做决定。你可以看到下面图中划分了两条线,一条是安全线,一条是致命线。当集群的水位线位于致命线以下时,就需要立即扩容,在扩容一定数量的机器后,水位线回到安全线以上并保持一段时间后,就可以进行缩容了。

 

如何做好微服务容量规划?图片

  1. 扩容策略:在决定增加多少机器时,通常根据集群现有规模的比例来进行。例如,可以选择每次扩展总机器数的30%,然后重新评估集群的负载情况。这种按比例扩容的方法适用于各种规模的集群,能确保扩容后的负载仍然保持在安全范围内。
  2. 缩容策略:当集群的负载在安全水平上维持一定时间后,可以考虑缩容以节约成本。缩容的时机和频率可根据业务特点决定。例如,如果业务流量通常在一小时内回落,可以在负载维持在安全线以上一个小时后开始缩容。缩容过程中采取逐步减少的方式,如每隔五分钟按照一定比例(例如10%、30%、50%)逐步减少机器,以避免因过快缩容导致负载突然增加。总结:容量评估方面,首先要通过压测获取集群的最大容量,并实时采集服务调用的数据以获取集群的实时运行负荷,这样就可以获取集群的实时水位线。而调度决策方面,主要是通过水位线与致命线和安全线对比来决定什么时候该扩缩容。而扩缩容的数量也是有讲究的,扩容的机器数一般按照集群机器数量的比例来,而缩容一般采取逐步缩容的方式以免缩容太快导致反复扩容。


Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  Search: 微服务  点击:(4)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  Search: 微服务  点击:(114)  评论:(0)  加入收藏
九条微服务最佳实践,你学会了哪条?
微服务之间连贯一致的代码库对于可维护性至关重要。保持代码成熟度相似,可确保系统统一演进,防止服务间出现性能、安全性和功能差异。在开发微服务时,我们需要遵循哪些最佳实践...【详细内容】
2024-01-05  Search: 微服务  点击:(97)  评论:(0)  加入收藏
Go微服务入门到容器化实践
Go微服务入门到容器化实践Go 是一门高效、现代化、快速增长的编程语言,非常适合构建 Web 应用程序。而 Docker 是一种轻量级的容器化技术,能够使得您的应用程序在任何地方运行...【详细内容】
2024-01-01  Search: 微服务  点击:(61)  评论:(0)  加入收藏
微服务全做错了!谷歌提出新方法,成本直接降为1/9!
2023,微服务“水逆”之年。长期以来,不管大厂还是小厂,微服务都被认为是云原生服务应用程序架构的事实标准,然而2023,不止那位37signals的DHH决心下云,放弃微服务,就连亚马逊和谷歌...【详细内容】
2023-12-29  Search: 微服务  点击:(117)  评论:(0)  加入收藏
微服务架构中的数据一致性
在微服务中,一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案,如果其中一个分布式流程参...【详细内容】
2023-12-27  Search: 微服务  点击:(141)  评论:(0)  加入收藏
监控 Spring Cloud 微服务的实践方案
一、简介Spring Cloud是一个基于Spring Boot实现的微服务框架,它提供了丰富的微服务功能,如分布式配置、服务注册与发现、服务熔断、负载均衡等。为了更好地管理和监控这样复...【详细内容】
2023-12-19  Search: 微服务  点击:(141)  评论:(0)  加入收藏
聊聊微服务链路服务
微服务架构图片如果有用户反馈某个页面很慢,我们知道这个页面的请求调用链是 A -----> C -----> B -----> D(图片有误),怎么来定位是由哪个服务引起的问题呢? 更进一步,如果...【详细内容】
2023-12-15  Search: 微服务  点击:(123)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  Search: 微服务  点击:(177)  评论:(0)  加入收藏
Eureka: 微服务架构中不可或缺的服务治理工具
Eureka是Netflix开源的一款用于服务治理的工具,它是NetflixOSS(OpenSourceSoftware)项目的一部分,主要用于实现微服务架构中的服务注册与发现。在当今庞大而复杂的微服务系统中,E...【详细内容】
2023-12-14  Search: 微服务  点击:(190)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(4)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(5)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(8)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(114)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条