分布式限流方案及实现

news2025/1/21 18:43:12

优质博文:IT-BLOG-CN

一、限流的作用和意义

限流是对高并发访问进行限制,限速的过程。通过限流来限制资源,可以提高系统的稳定性和可靠性,控制系统的负载,削峰填谷,保证服务质量。

服务限流后的常见处理方式:
【1】拒绝服务;
【2】排队或等待;
【3】服务降级(当服务器压力剧增的情况下,根据当前业务情况及流量对一些非核心服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行);

二、限流的主要方式

限流可以分为两大类:
【1】单机限流:计数器、互动窗口、漏桶算法、令牌桶算法;

计数器: 取固定大小的时间窗口,并在每个窗口时间内限制请求数量。只需要记录一个计数器,并在每个时间窗口结束时将其重置为零。每当请求进入系统时,我们都会将计数器加一,并检查它是否超过了限制的阈值。这种方式的缺点是:窗口是固定的,在两个窗口边界会有流量超限问题。
在这里插入图片描述

滑动窗口: 滑动窗口的基本思想是在固定窗口基础之上,将一个窗口分为若干个等分的小窗口,每个小窗口对应不同的时间点,拥有独立的计数器。当请求的时间点大于当前窗口的最大时间点时,则将窗口向前平移一个小窗口。如果请求数量超过了小窗口的限制的阈值,则决绝该请求。时间区间精度越高,所需空间容量越大。每一次小窗口就判断是否超过1分钟的阈值,取当前小窗口的前后五分钟的请求量,例如下图虚线框部分。提高了限流的频率和准确性。
在这里插入图片描述

漏桶算法: 可粗略的认为就是注水漏水的过程,往桶中以任意流速流入水,以一定速率流出水,当水超过桶容量则触发限流,因为出水速率是不变的,所以保证了资源的请求速率。漏桶算法是一个强制限制请求速率的方式,有两个缺点:
 ● a)无法应对正常的突发流量:实际上突发一波请求流量是正常现象。漏桶算法中的漏桶容易被突发流量打满,导致后续的正常请求被限流。
 ● b)无法有效利用资源:严格限制请求量,无法充分利用资源。
在这里插入图片描述

令牌桶算法: 令牌桶算法是对漏桶算法的改进,能在限制调用的平均速率的同时还允许一定程度的突发调用。
限流过程:
 ● a)系统以恒定的速率产生令牌,然后将令牌放入令牌桶中;
 ● b)令牌桶有容量限制;
 ● c)每次请求需要从令牌桶中获取令牌,有令牌则提供法务,无令牌则拒绝服务;
在这里插入图片描述

令牌桶算法一定程度上可以防止突发流量,以每分钟100请求量为例,如果前一分钟使用了90个令牌,则当前就可以使用110个令牌容量,来处理突发请求。作为漏桶算法的改进,令牌桶算法在限流场景下被广泛使用。
Guava为我们提供了很好的基于令牌桶算法的流控工具RateLimiter,可以支持突发流量也可以支持预热等多种功能,简单好用。

【2】分布式限流:Redis令牌桶、发票服务器Sentinel

三、单机限流 VS 分布式限流

【1】单机限流在单机上运行性能好,状态稳定。但如果分布式系统使用单纯的单机限流,开启HPA后流量会处于半失控状态,如果扩容整个集群限流就会变大,缩容整个集群限流就会变小。
【2】已有的分布式限流方案需要每次/每批请求都需要请求“阈值管理者”单点,增加了服务端的网络开销和不稳定因素,“阈值管理者”的稳定性也是影响结果的一个重要因素。
【3】如果能结合单机限流和分布式限流的优点,就是我们这次需要的分布式限流框架。

四、聚合查询限流场景

场景: 请求量大且调用方多:10000+渠道,平均QPS5000+

为什么需要限流:
【1】请求流量不稳定:存在突发流量(爬虫、活动);
【2】资源有限:部分底层资源不能抗衡突发流量(第三方接口),部分资源收费;
【3】业务要求:业务合同原因(甲方产品有限),需要限制调用方请求数;

为什么不能使用公司接口框架自带的限流功能: 因为相同调用方拥有多个销售渠道,存在不同销售渠道流量限制不同的场景,框架自带服务ID和操作OP的限流维度不能满足需求。

核心主流程: 需要保证响应速度和稳定性。

限流配置经常调整。

聚合层限流服务

限流功能主要基于RateLimiter高效可靠。由限流服务端更新推送限流资源配置,监听客户端状态。这种方案结合了单机限流和分布式限流的优点。

以下面场景说明限流服务工作过程:
【1】限流Clinet初始化: 引入限流Client的应用启动时,限流Client将初始化Client自动从限流服务端获取全量的单机限流参数,根据不同资源名初始化不同的RateLimiter并存入缓存;
在这里插入图片描述

【2】Client限流过程: 限流Client初始化后,业务服务端正常运行时,限流Client以单机令牌桶限流的方式进行限流,和限流服务端无交互,减少不必要的调用和依赖;
在这里插入图片描述

【3】修改限流配置: 修改配置时,限流服务端通过消息通知所有Client更新限流参数;
在这里插入图片描述

【4】被限流的服务集群状态变更: 业务服务端实例发生变更时(扩缩容、拉入拉出等),限流服务端监听注册中心实例变更消息并重新计算限流值,通知限流Client更新限流;
在这里插入图片描述

【5】Client定期同步配置: 限流组件Client也会定期从限流服务端拉取最新的限流配置,保证使用数据的新鲜度;
在这里插入图片描述

功能

【1】支持多种资源名称配置维度,例如渠道、子渠道等,且可以自定义多种限流维度。
【2】支持将限流值配置至Group维度,使不同Group使用不同的限流值。

优化点

目前组件的限流功能依赖于负载均衡,需要优化在负载不均衡的情况。将结合其他限流方案进行优化。

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

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

相关文章

CSS动画——实现波浪摇摆效果...

一、效果展示 以下主要实现四个动画: 元素上下摇摆动画波浪上下摇摆动画气泡上升及消失动画连续气泡右飘动画 二、实现思路 这里主要讲一下波浪上下摇摆动画和连续气泡右飘动画的实现思路 这里拿一张波浪图来举例解释实现波浪动画的思路: 波浪的摇…

14-测试分类

1.按照测试对象划分 ①界面测试 软件只是一种工具,软件与人的信息交流是通过界面来进行的,界面是软件与用户交流的最直接的一层,界面的设计决定了用户对设计的软件的第一印象。界面如同人的面孔,具有吸引用户的直接优势&#xf…

深入理解Gradle构建系统的工作原理

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

《被讨厌的勇气》勇敢的人先享受世界

《被讨厌的勇气》勇敢的人先享受世界 岸见一郎,古贺史健 著 (岸见一郎:日本作家,心理学家,哲学家。致力于研究哲学和阿德勒心理学。) 渠海霞 译 文章目录 《被讨厌的勇气》勇敢的人先享受世界[toc]第一夜 我…

iOS 应用上架流程详解

iOS 应用上架流程详解 欢迎来到我的博客,今天我将为大家分享 iOS 应用上架的详细流程。在这个数字化时代,移动应用已经成为了人们生活中不可或缺的一部分,而 iOS 平台的 App Store 则是开发者们发布应用的主要渠道之一。因此,了解…

从电容到晶体管的基本介绍

​随着科技的不断进步,元器件在现代电子学中扮演着至关重要的角色。从电容器到晶体管,各种元器件都具有不同的特性和用途。本文将从基础知识出发,介绍电子学中常见的元器件,以及它们在电路中的作用和应用。 电容器 电容器是一种…

CommonCollections6链分析

前面和CC1一样 优点是不限制jdk版本和cc的版本 先开一个ChainedTransformer 然后创LazyMap 我们顺便执行一下避免上面写错 能弹计算器 没问题 后面就是CC6不同的地方了 我们需要一个TiedMapEntry 因为需要一个类调用了get方法 在TiedMapEntry的getValue()方法中调用了get()…

哪些元器件在未来会有更广泛的应用?

随着科技的发展和进步,电子技术已经成为现代社会的重要组成部分。元器件作为电子产品的基本构成单元,其发展和应用对于电子技术的进步和创新有着至关重要的作用。随着人工智能、物联网和智能制造等新兴技术的快速发展,一些元器件已经或者将在…

vue基础-diff算法

vue基础-diff算法 1、根元素改变2、根元素不变 1、根元素改变 同级比较-根元素的变化-整个dom树删除重建 2、根元素不变 同级比较,根元素不变-属性改变更新属性

【计算机网络】HTTP详解

系列综述: 💞目的:本系列是个人整理为了秋招工作面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于小林Codeing进行的,每个知识点的修正和深入主要参考…

Prometheus 服务端与客户端

服务端安装配置 1)下载服务端: wget https://github.com/prometheus/prometheus/releases/download/v2.43.0-rc.0/prometheus-2.43.0-rc.0.linux-amd64.tar.gztar zxvf prometheus-2.43.0-rc.0.linux-amd64.tar.gz#解压 tar -xvf prometheus-2.32.1.li…

iOS开发-启动页广告实现

iOS开发-启动页广告实现 启动页广告实现是一个非常常见的广告展示模式。 就是在启动时候显示广告,之后点击跳转到广告页面或者其他APP。 一、实现启动页广告 启动页广告控件实现,将View放置在keyWindow上,显示广告图片,点击广告…

https://app.hackthebox.com/machines/Sau

https://app.hackthebox.com/machines/Sau https://app.hackthebox.com/machines/Sau1.info collecting └─$ nmap -A 10.10.11.224 -T4 Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-30 15:36 HKT Nmap scan report for 10.10.11.224 (10.10.11.224) Host is up (…

Arrays(数组)工具类

java.util.Arrays 是一个与数组相关的工具类,里面提供了大量静态方法,用来实现数组常见的操作。 Arrays.toString ( 数组名 )将参数数组变成字符串(按照默认格式:[10, 20, 30])Array.sort ( 数组名 ) 按照默认升序&…

C++ ------类和对象详解六大默认成员函数

文章目录 类的6个默认成员函数概念 构造函数概念特点 析构函数概念特征 拷贝构造函数概念特点 赋值运算符重载运算符重载的概念特性赋值运算符重载格式特性 取地址及const取地址操作符重载 类的6个默认成员函数 如果我们定义一个类,然后这个类中什么也没有。那么这里…

java之juc

juc是java.util.current的简写,意思是并发编程。 锁是什么?如何判断锁的是谁? 生产者和消费者问题 synchronized版本 package com.demo.juc.pc;/*** 线程之间的通信问题,生产者和消费者问题!* 线程交替执行** a b …

聊聊这几年的科技风口

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 数数这几年的科技风口:AR(包括什么MR、VR)、区块链(包括后来的什么web3)、元宇宙到现在的AI,下面逐一谈谈…

AI创作ChatGPT源码系统搭建教程+附源码/支持GPT4.0/支持ai绘画/mj以图生图/Mind思维导图

本系统使用Nestjs和Vue3框架技术,持续集成AI能力到本系统! ● 支持微信环境静默登录(可开启或关闭)、浏览器微信主动扫码登录、邮箱注册登录 ● 无认证公众号后台可关闭微信登录功能 ● 支持GPT3模型、GPT4模型、GPT联网功能 ● M…

TMS WEB Core Crack,TMS软件Delphi组件RADical Web

TMS WEB Core Crack,TMS软件Delphi组件RADical Web 使用我们的现代web应用程序框架,可以节省宝贵的时间并创造丰富的用户体验。我们所有的工具都由经验丰富的开发人员组成的专门团队提供支持。您可以信赖卓越的服务、活跃的社区和我们不断的创新。TMS Software是您的…