容量治理三板斧:扩容、限流与降级

news2024/10/5 13:03:00

前言

随着现代软件系统日益复杂和用户规模的不断增长,分布式架构成为了保持系统高可用性与高性能的标准解决方案。然而,随之而来的是对系统容量治理的新挑战。在这样的背景下,容量治理成为了分布式系统设计和运维中不可或缺的一环。要确保系统既能够应对高峰期的巨大访问压力,又能在用户较少时优化资源使用,我们必须掌握并运用容量治理的“三板斧”:扩容、限流与降级。本篇文章将深入介绍这三种常见的架构理念,帮助读者理解它们的工作原理及应用场景,以及如何有效地将这些理念整合到我们的分布式架构策略中。

正文

在我们进行分布式架构设计的时候,需要对当前业务流量进行评估,可以从容量治理三板斧:扩容、限流与降级方面来建立系统的冗灾体系,将潜在的系统故障带来的损失,降到最低。

在这里插入图片描述

扩容

当我们系统采用的是微服务的架构的时候,我们理论上可以通过增加机器的方式,来提高我们整个系统处理业务请求的吞吐量。在进行扩容的时候我们需要了解负载均衡和预热,从而达到扩容提升系统的并发能力的目标。

负载均衡

负载均衡通常有两种方式:分别是四层负载均衡与七层负载均衡,它们的的区别在于:

  1. 四层交换机通过解析TCP头等协议的内容,来决定分流的目的地;
  2. 七层交换机则通过解析软件应用层的内容来决定分流的目的地。
  3. 四层是基于IP+端口号进行负载均衡的,七层是基于URL进行负载均衡的。
  4. 七层对负载均衡的设备要求更高,性能方面比四层弱。
  5. 七层负载均衡更加智能化,安全性上更加有保障。

负载均衡实现方案
常见负载均衡的方法有:

  1. 利用Http重定向负载均衡:即利用nginx中的rewirte模块来实现。(客户端行为,不需要服务器转发响应,这种方法性能比较差)
  2. DNS域名解析负载均衡:DNS负载均衡的控制权在域名服务商中,通常作为第一级负载均衡手段。(不需要服务器转发响应)
  3. 反向代理负载均衡:即利用nginx中的upstream模块来实现(配置简单,但性能也有局限性,响应要通过反向代理服务器返回给客户端)
  4. IP负载均衡:即利用网关服务器实现负载均衡(性能有提升,响应要通过网关服务器,受限于其网卡带宽)
  5. 数据链路层负载均衡:在通讯协议的数据链路层修改mac地址进行负载均衡。(不需要服务器转发响应,最常见的是LVS)

负载均衡算法

  • 轮询:所有请求被依次分发到每台应用服务器上,即每台服务器需要处理的请求数目都相同,适合于所有服务器硬件都相同的场景。
  • 加权轮询:在轮询的基础上,按照配置的权重将请求分发到每个服务器,高性能的服务器能分配更多的请求。
  • 随机:请求被随机分配到各个应用服务器,即使应用服务器配置不同,可以加权随机算法。(这种方法最常用)
  • 最小连接:记录每一个应用服务器正在处理的连接数,将新的请求分发到最少连接的服务器,也支持加权最小连接。
  • Hash选择:对请求的IP地址进行hash计算,实现同一个IP地址的请求总在一个服务器上处理。(实现对有状态应用服务器高可用的一种方式)

预热

缓存预热

缓存预热的策略

  1. 静态预热:系统启动时,根据历史访问模式或预期的访问模式,加载最常访问的数据到缓存中。
  2. 动态预热:通过监控工具来捕捉最近的访问模式和频率,动态地预热数据。
  3. 标准化脚本:编写脚本按照预定规则提前加载缓存数据。
  4. 后台处理:通过设置后台任务,定期地进行数据预热,例如在系统流量较低时预加载第二天特别活动的相关数据。
  5. 热点数据预热:针对访问频率高的数据(热点数据),在缓存失效前主动更新缓存。
机器预热

JIT技术

在Java中,解释执行模式通常指Java程序运行时,Java虚拟机(JVM)会逐条将字节码指令转换(解释)成机器码然后执行,而不是将整个程序编译成机器语言再执行。

JVM实现引入了即时编译(Just-In-Time, JIT)技术,即在程序运行时动态地将字节码编译成机器码,这样热点代码(经常执行的代码)就可以直接以编译后的机器码运行,从而提高了执行效率。
使用-XX:CICompilerCount参数可以来设置编译线程数目,这个值默认是2。

机器预热的方式

  • 程序主动预热:在启动完成后,程序主动的访问热点的代码,确保主要的热点代码已被编译成机器码后再放入流量,可通过-XX:+PrintCompilation来确认。

  • 复制流量预热:通过tcpcopy软件拷贝一份线上nginx的流量进行预热,完成之后再导入线上流量。

限流

限流算法

我们常见的限流算法有:

  • 漏桶算法
  • 令牌桶算法
  • 滑动窗口算法
漏桶算法

nginx的limit_conn_zone模块底层就是漏桶算法,它的特点是:

  • 它可以简单的比作就是注水漏水过程,往桶中以一定速率流出水,以任意速率流入水,当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。
  • 它能够强行限制数据的传输速率,但是由于流速是恒定的,对突发特性的流量是无法处理的 。
    在这里插入图片描述
令牌桶算法
  • 能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。
  • 令牌桶算法是最常用的限流算法,通常配合redis来实现。

令牌桶算法的组件

  • 计数器:实时地统计接口的调用速率,记录单位时间内调用了多少次。
  • 限流器:当令牌桶中令牌已经无法放入时,使用限流器进行限流。
  • 阈值配置:用于配置时间窗口,平均速率以及突发情况下允许的最大速率
  • 阈值更新:通过一个参数来实时调整对阈值的配置
  • 令牌桶:通过一个工具类根据配置的时间窗口、平均速率、突发最大速率来模拟向桶中放置令牌的操作,如果溢出了,则触发限流器操作。

它的工作原理可以简单概括为:

  1. 所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
  2. 根据限流大小,设置按照一定的速率往桶里添加令牌;
  3. 桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝;
  4. 请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完业务逻辑之后,将令牌直接删除;
  5. 令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令牌,以此保证足够的限流;
    在这里插入图片描述

知识点:
a.在某种极端情况下存在请求量两倍进入:

  1. 令牌桶比如以 1个/1秒 速率进入时,请求又是以 2个/1秒进入,这个时候令牌桶并没有满,请求数就是令牌数的两倍,
  2. 如果超过平均速率的突发流量持续的时间过长,并且令牌桶的令牌没有得到释放,那么存在请求数是令牌桶大小的两倍。
滑动窗口算法

我们熟知的Sentinel高可用流量控制框架采用的就是滑动窗口的方式进行流量控制。

  • 它将时间窗口划分为更小的时间片段,每过一个时间片段,我们的时间窗口就会往右滑动一格,每个时间片段都有独立的计数器。
  • 我们在计算整个时间窗口内的请求总数时会累加所有的时间片段内的计数器。
  • 时间窗口划分的越细,那么滑动窗口的滚动就越平滑,限流的统计就会越精确。
    简单举个例子:我们设置一个窗口有两个方案
  • 设置 A :10s 100条请求
  • 设置 B :1s 10条请求
    相对而言设置B的系统相对而言更加稳定。

在这里插入图片描述

总得来说:

  • 令牌桶算法:能够保证自身系统的流量均匀,令牌桶的填满时间,是由桶的自身容量、令牌漏出速率(桶下面的水管)、超过平均速率的突发流量持续的时间三个方面共同决定的。
  • 漏桶算法:保证被调用系统(目标系统)流量均匀,适合请求到达频率稳定、需要严格控制处理速率的场景,而令牌桶适合允许突发请求的情况。
    实际的生产中通常采用 漏桶算法+令牌桶算法的方式来对网络流量进行高效地控制。

限流设计

我们在评估系统业务的流量模型时,常常可以梳理出类似于下图“漏斗式”的流量图,我们可以根据实际的流量对每一层级的业务接口设置合理的限流值。
在这里插入图片描述

sentinel 限流

Sentinel 是面向微服务的轻量级流量控制框架,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel的限流原理

  • Sentinel以Bucket(桶)为单位记录一个时间窗口内的请求总数、异常总数、总耗时等指标数据。
  • 而一个Bucket可以是记录一秒内的数据,也可以是10毫秒内的数据,我们称这个时间窗口为Bucket的统计单位,由使用者自定义。

所以Sentinel是基于滑动窗口算法来实现的。

降级

缓存降级

使用缓存的方式,是我们最常用的性能优化的方式,某种意义它也是一种业务降级的方式,通过牺牲一定数据一致性换取高性能。

四层缓存
  • 基于浏览器等设备的客户端缓存
  • 基于CDN加速的网络层缓存,通过CDN能够实现对页面的缓存
  • 基于Ngnix等负载均衡组件(proxy_cache和 squid)的路由层缓存
  • 基于Redis等的业务层缓存

业务层的缓存可以细分:

  • 一级缓存(会话级缓存):在维持一个会话时,查询获取的数据会存放在一级缓存中,下次使用从缓存中获取。
  • 二级缓存(应用级缓存):当会话关闭时,一级缓存的数据会保存在二级缓存中。
  • 三级缓存(数据库级缓存):可以实现跨jvm,通过远程调用的方式实现数据同步。

业务降级

非核心组件降级

针对核心业务服务的压力剧增,根据当前业务场景和流量对其他非核心服务进行降级处理,比如进行限流、业务组件降级等方式,快速返回等处理,释放资源保证核心任务的正常运行。

设计异常情况下的最短交易路径

当系统发生短时间难以恢复的问题的时候,我们要梳理出“商品下单”的最短交易路径,保证核心链路可用。等待系统逐步恢复正常的时候,我们可以采用异步的方式,对一些缺失的数据进行补齐。

总结

在面对不断波动的用户请求与系统负载时,一个精心设计的分布式架构必须具备出色的容量治理能力。在众多治理策略中,扩容、限流与降级无疑是最为有效的“三板斧”。它们不仅确保了在用户访问激增时系统的稳定性和响应速度,也充分考虑了成本效益,最大化了资源的利用效率。扩容提供了处理高峰流量的必要硬件支持,限流则确保了系统不会因超载而崩溃,而降级则在必要时牺牲部分服务质量,保证了核心功能的正常运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论一】

简介: 2014年Ian Goodfellow提出以来,GAN就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进DCGAN依靠的是对…

AI毕业设计生成器(基于AI大模型技术开发)支持Java和Python

这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目,运用tengsorflow技术,训练出了AI大模型。基本实现了计算机毕业设计生成器,能够初步生成Java或python基本源码。…

嵌入式驱动学习第三周——container_of()宏

前言 Linux内核编程中,会经常看见一个宏函数container_of,那么这究竟是什么呢,本篇博客记录学习container_of的过程。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可…

1688平台最关键的接口接入实例|获得1688商品详情| 按关键字搜索商品| 按图搜索1688商品(拍立淘)| 获得淘口令真实url

参数说明 通用参数说明 version:API版本key:调用key,测试key:test_api_keyapi_name:API类型[item_get,item_search]cache:[yes,no]默认yes,将调用缓存的数据,速度比较快result_type:[json,xml,serialize,var_export]返回数据格式,默认为jsonl…

【JavaScript 漫游】【034】AJAX

文章简介 本篇文章为【JavaScript 漫游】专栏的第 034 篇文章,对浏览器模型的 XMLHttpRequest 对象(AJAX)的知识点进行了总结。 XMLHttpRequest 对象概述 浏览器与服务器之间,采用 HTTP 协议通信。用户在浏览器地址栏键入一个网…

Cisco Packet Tracer模拟器实现交换机的vlan配置、生成树技术及模拟器路由设置

1. 内容 1.对交换机进行Vlan配置,完成交换机Vlan的划分、交换机间相同Vlan的通信以及三层交换机的配置。 2.实现交换机的生成树技术,在两个交换机上配置生成树协议,实现Vlan的负载均衡 3.对路由器进行设置,包括模拟器中路由器的…

案例分析篇07:数据库设计相关28个考点(23~28)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

基于yolov5的草莓成熟度检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示: 基于yolov5的草莓成熟度检测系统,系统既能够实现图像检测,也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili (一)简介 基于yolov5的草莓成熟度系统是在pytorch框架下实现的,这是一个完整的项目…

力扣226.翻转二叉树(二叉树的先序遍历)

文章目录 题目描述思路复杂度Code 题目描述 思路 利用二叉树的先序遍历,每次递归遍历时将当前节点的左右子节点交换即可 复杂度 时间复杂度: O ( n ) O(n) O(n);其中 n n n为树节点的个数 空间复杂度: O ( h e i g h ) O(heigh) O(heigh);其…

虚位以待!OpenHarmony开发者激励计划持续招募中

虚位以待!OpenHarmony开发者激励计划持续招募中 自2022年5月7日,OpenHarmony开发者激励计划启动招募以来,就正式公开邀请广大开发者们参与 OpenHarmony 生态共建。随着社区的快速成长,目前已有累计超过7000名贡献者,产…

7个帮您恢复文件的Android 数据恢复推荐

您的 Android 设备上保存哪些类型的数据?如果您像大多数人一样,那么您可能已经列出了文档、照片、视频和音频文件。如果您使用智能手机或平板电脑的时间足够长,我们愿意打赌您对 Android 数据丢失有第一手经验。 对您来说幸运的是&#xff0…

目标检测数据集:手机顶盖焊缺陷检测数据集

✨✨✨✨✨✨目标检测数据集✨✨✨✨✨✨ 本专栏提供各种场景的数据集,主要聚焦:工业缺陷检测数据集、小目标数据集、遥感数据集、红外小目标数据集,该专栏的数据集会在多个专栏进行验证,在多个数据集进行验证mAP涨点明显,尤其是小目标、遮挡物精度提升明显的数据集会在该…

ubuntu 18.04安装教程(详细有效)

文章目录 一、下载ubuntu 18.04镜像二、安装ubuntu1. 点击下载好的Vmware Workstation,点击新建虚拟机,选择 “自定义(高级)”,之后下一步。2. 默认配置,不需要更改,点击下一步。3. 选择 “安装程序光盘映像文件(iso)(…

用信号的方式回收僵尸进程

当子进程退出后,会给父进程发送一个17号SIGCHLD信号,父进程接收到17号信号后,进入信号处理函数调用waitpid函数回收僵尸进程若多个子进程同时退出后,这是切回到父进程,此时父进程只会处理一个17号信号,其他…

vulhub中Weblogic SSRF漏洞复现

Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。 访问http://your-ip:7001/uddiexplorer/,无需登录即可查看uddiexplorer应用。 SSRF漏洞测试 SSRF漏洞存在于http://your-ip:7001/ud…

魅族录屏功能在哪里?这篇文章告诉你答案

“魅族录屏功能在哪里?作为一名魅族手机的新用户,我对这款手机非常满意。然而,最近我在工作中需要用到录屏功能,却找不到如何开启的方法。想请教各位魅族手机的达人们,能否分享一下录屏功能的开启方法?非常…

Android studio Gradle下载失败,如何手动配置解决该问题详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 前言: 今天在打开公司一个项目时,突然要重新下载相关的gradle&am…

JWT实战之升级Java JWT

概述 关于JWT的基础概念,如JWT组成部分,以及入门实战,如:如何生成Token、如何解析Token、怎么加入自定义字段等,可参考JWT入门教程。 如前文提到的blog所述,大多数公司都会使用如下(版本&…

C#,入门教程(26)——数据的基本概念与使用方法

上一篇: C#,入门教程(25)——注释(Comments)你会吗?看多图演示,学真正注释。https://blog.csdn.net/beijinghorn/article/details/124681888 本文所述的知识基本上适用于C/C++,java等其他语言。 数据是程序的基础,算法是程序的栋梁。 徒弟们交作业的之后,一般都会有…

【Sql】数据库的三范式?MySQL数据库引擎有?InnoDB与MyISAM的区别

目录 数据库的三范式? MySQL数据库引擎有? InnoDB与MyISAM的区别 数据库的三范式? 第一范式:是数据库最基本的要求,列不可再分 第二范式:行可以唯一区分,主键约束 第三范式:是在…