分布式限流方案及实现

优质博文: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.rhkb.cn/news/74145.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文笔记】KDD2019 | KGAT: Knowledge Graph Attention Network for Recommendation

Abstract 为了更好的推荐,不仅要对user-item交互进行建模,还要将关系信息考虑进来 传统方法因子分解机将每个交互都当作一个独立的实例,但是忽略了item之间的关系(eg:一部电影的导演也是另一部电影的演员&#xff09…

【React】关于组件之间的通讯

🌟组件化:把一个项目拆成一个一个的组件,为了便与开发与维护 组件之间互相独立且封闭,一般而言,每个组件只能使用自己的数据(组件状态私有)。 如果组件之间相互传参怎么办? 那么就要…

[nlp] TF-IDF算法介绍

(1)TF是词频(Term Frequency) 词频是文档中词出现的概率。 (2) IDF是逆向文件频率(Inverse Document Frequency) 包含词条的文档越少,IDF越大。

Maven依赖管理

依赖特性: 1、依赖配置 2、依赖传递 3、可选依赖 4、排除依赖 5、依赖范围

linux(centos) docker 安装 nginx

​1、拉取nginx最新版本镜像 docker pull nginx:latest 查看镜像 docker images 或者 docker images -a 2.启动nginx容器 docker run -d -p 80:80 --name nginx nginx 使用docker run命令,启动nginx容器。 --name,设置容器名。为方便记忆&#xff…

监控数据的采集方式及原理

1、读取 /proc 目录 /proc 是一个位于内存中的伪文件系统,该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,Linux 操作系统层面的很多监控数据,比如内存数据、网卡流量、机器负载等,都是从 /proc 中获取的…

设计模式-中介者模式在Java中使用示例-客户信息管理

场景 欲开发客户信息管理窗口界面,界面组件之间存在较为复杂的交互关系:如果删除一个客户, 要在客户列表(List)中删掉对应的项,客户选择组合框(ComboBox)中客户名称也将减少一个; 如果增加一个客户信息,…

接口自动化代码不会写?试试RunnerGo

RunnerGo支持自动化测试功能,RunnerGo的工作流程是:接口管理-场景管理-性能测试-自动化测试,所以自动化测试的运行内容为场景下的用例,我们可以在“场景管理”中预先配置好该场景下的用例,也可以在自动化测试中创建用例…

Tensorflow benchmark 实操指南

环境搭建篇见环境搭建-CentOS7下Nvidia Docker容器基于TensorFlow1.15测试GPU_东方狱兔的博客-CSDN博客 1. 下载Benchmarks源码 从 TensorFlow 的 Github 仓库上下载 TensorFlow Benchmarks,可以通过以下命令来下载 https://github.com/tensorflow/benchmarks 我…

如何使用大模型处理生活繁琐的工作

如果每封电子邮件、每个带有订单、发票、投诉、录用请求或工作申请的 PDF 都可以翻译成机器可读的数据,会怎样?然后可以由 ERP / CRM / LMS / TMS 自动处理吗?无需编程特殊接口。 听起来很神奇?它确实有一些魔力。但最近已成为可…

【计算机视觉中的 GAN 】 - 生成学习简介(1)

一、说明 在阅读本文之前,强烈建议先阅读预备知识,否则缺乏必要的推理基础。本文是相同理论GAN原理的具体化范例,阅读后有两个好处:1 巩固了已经建立的GAN基本概念 2 对具体应用的过程和套路进行常识学习,这种练习题一…

3D Web轻量化渲染开发工具HOOPS Communicator是什么?

HOOPS Communicator是Tech Soft 3D旗下的主流产品之一,具有强大的、专用的高性能图形内核,是一款专注于基于Web端的高级3D工程应用程序。由HOOPS Server和HOOPS Web Viewer两大部分组成,提供了HOOPS Convertrer、Data Authoring的模型转换和编…

对模版以及模版中参数的理解

所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。 就比方说你想要实现 一个Add的加法函数,面对不同的类型,你是否要进行多次函数重载呢,其实这多…

HCIP——前期综合实验

前期综合实验 一、实验拓扑二、实验要求三、实验思路四、实验步骤1、配置接口IP地址2、交换机配置划分vlan10以及vlan203、总部分部,骨干网配置OSPF分部总部骨干网 4、配置BGP建立邻居关系总部骨干网分部 5、发布用户网段6、将下一跳改为本地7、允许AS重复8、重发布…

计算机图形学笔记2-Viewing 观测

观测主要解决的问题是如何把物体的三维“模型”变成我们在屏幕所看到的二维“图片”,我们在计算机看到实体模型可以分成这样几步: 相机变换(camera transformation)或眼变换(eye transformation):想象把相机放在任意一个位置来观测物体&#…

Electron + Vue3 + Vite + TS 构建桌面应用

之前是使用React、Electron、TS和webpack来构建桌面应用的。虽然功能齐全,但是打包等等开发的体验不太理想,总感觉太慢了。作为一个开发者,我们总是希望,执行构建命令后,可以快速打包或者启动本地应用,且通过更少的配置,来完成开发体验。 现在的vite已经得到广泛的应用…

Linux操作系统学习,Linux基础命令大全

目录 第一章、Linux简介和安装1.1)Linux简介和分类1.2)安装VMware虚拟机,在虚拟机中安装CentOS 7 第二章、虚拟机中Linux的IP地址配置详解2.1)什么是IP地址,如何查看2.2)虚拟机NAT模式中Linux的IP地址设置有…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

mysql-入门笔记-3

# ----------排序查询-------- # 语法 # select 字段列表 from 表名 order by 字段1 排序方式1 ,字段2 排序方式2 ; DESC 降序 ASC升序 # 1 根据年龄对公司的员工进行升序排序---默认升序-黄色提示代码冗余 select * from userTable order by age ASC ; # 2 根据入职时间,对员…

【二叉树进阶】二叉树的前中后序遍历(非递归迭代实现)

文章目录 1. 二叉树的前序遍历1.1 思路分析1.2 AC代码 2. 二叉树的中序遍历2.1 思路分析2.2 AC代码 3. 二叉树的后序遍历3.1 思路13.2 思路1AC3.3 思路23.4 思路2AC 1. 二叉树的前序遍历 题目链接: link 不用递归,用迭代算法如何实现对二叉树的前序遍历&#xff1f…