当前位置: 首页 > news >正文

分布式限流方案及实现

优质博文: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使用不同的限流值。

优化点

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

相关文章:

分布式限流方案及实现

优质博文:IT-BLOG-CN 一、限流的作用和意义 限流是对高并发访问进行限制,限速的过程。通过限流来限制资源,可以提高系统的稳定性和可靠性,控制系统的负载,削峰填谷,保证服务质量。 服务限流后的常见处理…...

vuejs源码阅读之优化器

前面讲过vuejs中解析器是把html模版解析成AST,而优化器的作用是在AST中找到静态子树并打上标记。 静态子树是指的那些在AST中永远不会发生变化的节点。 例如,一个纯文本节点就是静态子树,而带变量的文本节点就不是静态子树,因为…...

【C++】-动态内存管理

作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 文章目录 前言一、C内存管理方式1.1 new/delete操作内置类型 总结 前言 今天再讲一个…...

微服务SpringCloud教程——微服务是什么

微服务(MicroServices)最初是由 Martin Fowler 于 2014 年发表的论文《MicroServices》中提出的名词,它一经提出就成为了技术圈的热门话题。 微服务,我们可以从字面上去理解,即“微小的服务”,下面我们从“…...

RNN架构解析——LSTM模型

目录 LSTMLSTM内部结构图 Bi-LSTM实现 优点和缺点 LSTM LSTM内部结构图 Bi-LSTM 实现 优点和缺点...

苹果电脑系统优化工具:Ventura Cache Cleaner for mac

Ventura Cache Cleaner for Mac是一款专门为苹果电脑开发的系统优化工具,旨在帮助用户清理和优化Mac电脑,提高系统性能和速度。该软件由美国公司Northern Softworks开发,已经推出了多个版本,适用于不同版本的Mac操作系统。 Ventu…...

为了爱人穿越沙漠-心理测试

我觉得很准的一个心理测试。我的答案反射出我的态度,它们是100%的贴切。有兴趣的朋友也不妨一试。 你有一个深爱着的心上人,然而你们却被一片无垠的沙漠相隔两地,你禁不住思念的折磨,决定穿越沙漠去寻找你心中的那个爱人…… 1、…...

SpringBoot月度员工绩效考核管理系统【附任务书|ppt|万字文档(LW)和搭建文档】

主要功能 员工登录: ①首页、个人中心:修改密码、个人信息管理等 ②公告信息管理、绩效指标管理、绩效考核管理 管理员登录: ①首页、个人中心:修改密码、个人信息管理等 ②公告信息管理、部门管理、岗位管理、员工管理、绩效指标…...

【新星计划】STM32F103C8T6 - C语言 - 蓝牙JDY-31-SPP串口通信实验

文章目录 蓝牙技术的发展历史SPP蓝牙串口BLE协议(超低功耗应用蓝牙协议) 常见通用蓝牙模块JDY-31-SPPHC05/06 Keil 工程开发模版main.c 源文件:接线方式:烧录工具:FlyMcu串口调试工具:XCOM蓝牙调试助手APP …...

算法39:Excel 表列序号

一、需求 给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1: 输入: columnTitle “A” 输出: 1 示例 2&…...

Android:ImageView xml方式配置selector 图片切换

1、在res/drawable目录下创建一个新的XML文件&#xff0c;比如selector_image.xml <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"> <!-- 背景选择器 state_pre…...

Spring Boot 缓存 Cache 入门

Spring Boot 缓存 Cache 入门 1.概述 在系统访问量越来越大之后&#xff0c;往往最先出现瓶颈的往往是数据库。而为了减少数据库的压力&#xff0c;我们可以选择让产品砍掉消耗数据库性能的需求。 当然也可以引入缓存,在引入缓存之后&#xff0c;我们的读操作的代码&#xff…...

如何关闭谷歌浏览器自动更新

适用范围: 写自动化脚本时&#xff0c;需要安装浏览器驱动&#xff0c;安装浏览器驱动时需要下载对应的浏览器驱动版本&#xff0c;如果浏览器版本一直在自动更新的话&#xff0c;自动化脚本会报错浏览器版本和浏览器驱动不匹配&#xff0c;所以建议关闭谷歌浏览器自动更新&am…...

mybatis日志工厂

前言&#xff1a; 如果一个数据库操作&#xff0c;出现异常&#xff0c;我们需要排错&#xff0c;日志就是最好的助手 官方给我们提供了logImpl&#xff1a;指定 MyBatis 所用日志的具体实现&#xff0c;未指定时将自动查找。 默认工厂&#xff1a; 在配置文件里添加&#xf…...

020 - STM32学习笔记 - Fatfs文件系统(二) - 移植与测试

020 - STM32学习笔记 - Fatfs文件系统&#xff08;二&#xff09; - 移植与测试 上节学习了FatFs文件系统的相关知识&#xff0c;这节内容继续学习在STM32上如何移植FatFs文件系统&#xff0c;并且实现文件的创建、读、写与删除等功能。各位看官觉得还行的话点点赞&#xff0c…...

flask用DBUtils实现数据库连接池

flask用DBUtils实现数据库连接池 在 Flask 中&#xff0c;DBUtils 是一种实现数据库连接池的方案。DBUtils 提供了持久性&#xff08;persistent&#xff09;和透明的&#xff08;transient&#xff09;两种连接池类型。 首先你需要安装 DBUtils 和你需要的数据库驱动。例如&…...

SQL注入之布尔盲注

SQL注入之布尔盲注 一、布尔盲注介绍二、布尔盲注的特性三、布尔盲注流程3.1、确定注入点3.2、判断数据库的版本3.3、判断数据库的长度3.4、猜解当前数据库名称&#xff08;本步骤需要重复&#xff09;3.5、猜解数据表的数量3.6、猜解第一个数据表名称的长度3.7、猜解第一个数据…...

微服务入门---SpringCloud(一)

微服务入门---SpringCloud&#xff08;一&#xff09; 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求…...

Rust vs Go:常用语法对比(九)

题图来自 Golang vs Rust - The Race to Better and Ultimate Programming Language 161. Multiply all the elements of a list Multiply all the elements of the list elements by a constant c 将list中的每个元素都乘以一个数 package mainimport ( "fmt")func …...

Typescript 第五章 类和接口(多态,混入,装饰器,模拟final,设计模式)

第五章 类和接口 类是组织和规划代码的方式&#xff0c;是封装的基本单位。 typescript类大量借用了C#的相关理论&#xff0c;支持可见性修饰符&#xff0c;属性初始化语句&#xff0c;多态&#xff0c;装饰器和接口。 不过&#xff0c;由于Typescript将类编译成常规的JavaScri…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...