java面试:常见的限流算法有哪些

1 什么是限流算法

限流算法是一种用于限制流量请求的频率或速率的算法,其目的是在高并发或大流量请求的情况下,保护系统服务的安全性和可用性。限流算法可以应对热点业务带来的突发请求、调用方bug导致的突发请求以及恶意攻击请求等情况。是一种系统保护策略,主要是避免在流量高峰导致系统被压垮,造成系统不可用的问题。

2 常见的限流算法

(1)计数器限流

一般用在单一维度的访问频率限制上,比如短信验证码每隔60s 只能发送一次,或者接口调用次数等。它的实现方法很简单,每调用一次就加 1,处理结束以后减一。

计数器限流算法的实现原理是在一个时间窗口内,每调用一次就增加计数器,当时间窗口到达设定的时间后,计数器归零。如果在时间窗口内再次调用,则计数器再次增加。这种算法的优点是实现简单,但是存在临界问题。如果在一个时间窗口内的最后一次调用正好在时间窗口结束的瞬间,那么这个请求会被拒绝,因为计数器已经归零。为了解决这个问题,可以采用滑动窗口限流算法。该算法将时间窗口划分为多个小的时间段,每个时间段都有一个独立的计数器。当一个时间段结束时,该时间段的计数器归零,而其他时间段的计数器保持不变。这样就可以避免在时间窗口结束的瞬间出现请求被拒绝的情况。

用计数器实现限流有点简单粗暴,一般我们会限制一秒钟的能够通过的请求数,比如限流QPS为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。

具体的实现可以是这样的:对于每次服务调用,可以通过 AtomicLong#incrementAndGet()方法来给计数器加1并返回最新值,通过这个最新值和阈值进行比较。

这种实现方式,有一个弊端:如果我在单位时间1s内的前10ms,已经通过了100个请求,那后面的990ms,只能眼巴巴的把请求拒绝,我们把这种现象称为“突刺现象”。

(2)滑动窗口限流

本质上也是一种计数器,只是通过以时间为维度的可滑动窗口设计,来减少了临界值带来的并发超过阈值的问题。每次进行数据统计的时候,只需要统计这个窗口内每个时间刻度的访问量就可以了。Spring Cloud里面的熔断框架Hystrix ,以及Spring Cloud Alibaba里面的Sentinel都采用了滑动窗口来做数据统计。

(3)漏桶算法

漏桶算法主要是控制数据注入到网络的速率,平滑网络上的突发流量,是一种恒定速率的限流算法,不管请求量是多少,服务端的处理效率是恒定的。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。基于 MQ 来实现的生产者消费者模型,其实算是一种漏桶限流算法。

漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。

如图所示,把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。

可以看出,漏桶算法可以很好地控制流量的访问速度,一旦超过该速度就拒绝服务。

(4)令牌桶算法

相对漏桶算法来说,它可以处理突发流量的问题。它的核心思想是,令牌桶以恒定速率去生成令牌保存到令牌桶里面,桶的大小是固定的,令牌桶满了以后就不再生成令牌。每个客户端请求进来的时候,必须要从令牌桶获得一个令牌才能访问,当桶里没有令牌可取时,则排队等待。在流量低峰的时候,令牌桶会出现堆积,因此当出现瞬时高峰的时候,有足够多的令牌可以获取,因此令牌桶能够允许瞬时流量的处理。

网关层面的限流、或者接口调用的限流,都可以使用令牌桶算法,像 Google 的 Guava,和 Redisson 的限流,都用到了令牌桶算法在我看来,限流的本质是实现系统保护,最终选择什么样的算法,一方面取决于统计的精准度,另一方面考虑限流维度和场景的需求。

从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。

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

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

相关文章

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

文章作者:ajun 随着文档处理需求的增加,格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性,将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件,提供了这样的转换功…

【Unity】CatlikeCoding SRP

Unity 自定义渲染管线 提示:基于CatlikeCoding SRP系列教程学习 学习链接:SRP 个人测试: Demo 相关记录以后有时间再更:

kotlin中使用ViewBinding绑定控件

kotlin中使用ViewBinding绑定控件 什么是ViewBinding? View Binding是Android Studio 3.6推出的新特性,主要用于减少findViewById的冗余代码,但内部实现还是通过使用findViewById。通过ViewBinding,可以更轻松地编写可与视图交互…

c++的学习之路:2、入门(1)

一、 C关键字 c的关键字要比c语言要多31个足足有63个,这里我只是了解了下每个有啥作用,具体使用方法以及更多的知识将在后续学习中,慢慢扩展使用,下方表格就是c的63个关键字 asmdoifreturntryautodoubleinlinetypedefdynamic_ca…

#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行

3 月 19 日,#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行。 现场,深圳市南山区人民政府副区长李志娜发布《2024 年南山区支持鸿蒙原生应用发展首批政策措施清单》,从加强鸿蒙原生应用供给能力、推动鸿蒙原生应用产业集聚、完善鸿蒙原生…

Go语言学习Day1:什么是Go?

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、走近Go①Go语言的Logo②Go语言的创始人③Go语…

【开源】SpringBoot框架开发知识图谱构建系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 知识图谱模块2.2 知识点模块2.3 学生测评模块2.4 学生成绩模块 三、系统展示四、核心代码4.1 查询知识点4.2 新增知识点4.3 查询知识图谱4.4 查询学生成绩4.5 查询学生成绩 五、免责说明 一、摘要 1.1 项目介绍 基于J…

PycharmJH码,Pycharm稳定专属JH码(全网最新)

以idea为例,其他JH类似哦 第一步:下载J活工具包 首先,请先进行下载J活工具,如果之前已经下载,请直接跳过此环节。 👇👇点击链接中的链接,回复“永久”即可获取永久包👇…

jenkins Pipeline接入mysql

背景: jenkin pipeline进化过程如下: Jenkins Pipeline 脚本优化实践:从繁琐到简洁 >>>>> Jenkins Pipeline脚本优化:为Kubernetes应用部署增加状态检测>>>>>> 使用Jenkins和单个模板部署多个K…

天地一体化5G网络中LNA的辐射效应

Youssouf A S, Habaebi M H, Hasbullah N F. The radiation effect on low noise amplifier implemented in the space-aerial–terrestrial integrated 5G networks[J]. IEEE Access, 2021, 9: 46641-46651. 图2 面向卫星的5G综合网络架构方案 这篇论文《The Radiation Effect…

redis功能点

一、redis简介 概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很…

粘度指数改进剂市场需求增长 为润滑油添加剂细分产品

粘度指数改进剂市场需求增长 为润滑油添加剂细分产品 粘度指数改进剂是一种油溶性高分子聚合物,主要用于提高润滑油粘度以及粘度指数。粘度指数改进剂具有稠化能力强、抗磨性好、热稳定性好等优势,可添加于液压油、内燃机油以及齿轮油等油品中。 …

dij最短路径算法

Dijkstra算法解决的是单源最短路径问题:对于给定的有向网络G=(V,E)及单个源点v,求从v到G的其余各顶点的最短路径。 本文以下面的有向网络(用邻接矩阵存储)为例,并假设源点为1。 #include<stdio.h> #define maxsize 1000 //表示两点间不可达,距离为无穷远 #define…

基于SSM+Jsp+Mysql的KTV点歌系统

基于SSMJspMysql的KTV点歌系统 基于SSMJspMysql的KTV点歌系统的设计与实现 开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工…

TikTok能不能用或许没那么重要,重要的是互联网的互联时代结束了

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 朱峰 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo TikTok与美国政府“掰头”了五年多&#xff0c;换来一纸看来肯定可以通过的法案&#xff0c;而这条法案&#xff0c;可能会影响到所有…

HMI界面之:教育培训领域的重要帮手

一、教育培训行业都有哪些HMI界面形式 HMI人机交互界面在教育培训领域有以下几种形式&#xff1a; 电子白板&#xff1a;电子白板是一种交互式的教学工具&#xff0c;可以让教师和学生在白板上进行书写、标注、绘图等操作&#xff0c;与计算机进行互动&#xff0c;提高教学效果…

能见度监测站介绍

TH-NJD50能见度监测站是一种专门用于监测和记录大气中能见度的设备站点。其工作原理主要基于光在大气中的衰减规律&#xff0c;通过透射仪向一定距离的接收器发射光束&#xff0c;接收器测量经过大气透射的光强&#xff0c;从而计算出能见度。能见度是气象学中一个重要的气象要…

Twincat实现电机控制

不仅是控制系统的核心部分&#xff0c;而且能够将任何基于PC的系统转换为一个带有PLC、NC、CNC和机器人实时操作系统的实时控制系统。TwinCAT软件在工业自动化领域具有广泛的应用&#xff0c;特别是在机器人关节电机控制方面!!! 在机器人关节电机控制方面&#xff0c;TwinCAT通…

Linux的基本使用

1.Linux的背景 1.1什么Linux Linux是⼀个操作系统.和Windows是"并列"的关系. 1.2Linux系统的优势 1. 开源(意味着免费,便宜) 2. 稳定(Linux可以运⾏很多年,都不会发⽣重⼤问题) 3. 安全(Linux只有管理员或者特定⽤⼾才能访问Linux内核) 4. ⾃由(不会被强加商业产品和…

关于Ansible的模块 ①

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 什么是Ansible模块 在Linux中&#xff0c;bash无论是在命令行上执行&#xff0c;还是在bash脚本中&#xff0c;都需要调用cd、l…