聊聊几种基本限流算法

java线程-如何通过信号量实现限流 semaphore可以允许多个线程访问同一个临界区。比较常见的需求就是我们工作中遇到各种池化资源,例如连接池,对象池,线程池等等。其中,最熟悉的可能是数据库连接池,在同一时刻,一定是允许多个线程同时使用连接池的,当然,每个链接在被释放前,是不允许其他线程使用的。对象池:一次性创建出N个对象,之后所有的线程重复利用这N个对象,对象在被释放前,也是不允许其他线程使用的。对象池,可以用List保存实例对象。java复制代码class ObjPool {// 用信号量实现限流器// 构造函数。 阅读详情

对于一个分布式系统而言,如何保证系统的稳定可靠,永远都是头等大事。缓存、限流和降级是最有效也是我们最常用的手段,今天我们就一起来看看分布式系统是如何进行限流的。

为什么要限流

原因很简单,资源是有限的,我们的系统的接待能力也是有限的,对于那些已经超出系统接待能力的请求我们应该尽可能早的识别出来并让其等待或拒绝这些请求。
如果当大流量进入系统的时候不进行限流,那么处理请求能力最差的一个子系统将会最先宕机,进而导致依赖这个子系统的其它系统也跟着宕机,最终导致整个系统全面瘫痪,这就是系统雪崩效应。
在这里插入图片描述

限流算法

限流的前提是我们能够准确的计算出过去一段时间的请求数量,然后根据系统负载能力来判断接下来的请求是否放行。
常用的限流算法可以分为两大类:计数法和桶算法。其中计数法有可以分为简单计数器和滑动窗口计数法,桶算法则分为漏桶法和令牌桶法。
接下来我们就深入的分析一下这些限流算法的特点。

计数器

这种限流算法是最为简单直接的了。直接记录一下当前周期内的请求个数,如果请求个数超出了阈值,那么就限制请求,如果没有超出,就放行。如下图所示:
在这里插入图片描述

计数器法虽然实现上非常简单,也很容易理解,但是它的缺点也是非常明显的。我们假设一种情况:

系统限流的QPS为100,第一秒有90个所有的请求都在最后100ms进来,这个时候请求没有达到阈值,是不会限流的。紧接着第二秒也有90个请求,不过全部集中在前100ms进来,这个时候也没有达到阈值,也不会限流。然而如果我们全局分析,会发现在短短的200ms内进入了180个请求,这显然是远远超出了限流阈值100的。如题请求如下图所示:

在这里插入图片描述
显然计数器法在要求比较高的场景下是不适用的。

滑动窗口法

滑动窗口法是在计数器法的基础上演进而来的,也是采用计数的方式来统计过去一段时间的请求数。与计数器法不一样的地方是:滑动窗口计数会把计数窗口进行分割,比如分割成两份、10份等,分割的也小,精度越高。如下图所示:
在这里插入图片描述
上图展示了把统计窗口均分为10等分的情况,假设统计窗口为1秒,那么每一小格代表的就是100ms的请求计数,最近1秒中的请求总数就等于最近10小格的统计数之和。每过去100ms,统计窗口就向右滑动一小格(这就是滑动窗口法的由来),最新的数据记录在最右边位置,最左一格的数据将会被丢弃(具体实现上有所差异)。
其实滑动窗口法并没有完全消除计数器法中遇到的问题,它只是减小了影响。假设限流QPS大小为X,窗口均分为N份,那么理论上可以达到的峰值QPS为X * (N + 1) / N,它显然是大于X的。不过我们多均分几份以后,影响就会大大减少。

漏桶法

漏桶法非常的简单,也非常的形象。我们可以把整个系统看成一个水桶,进来的请求理解为往桶里注入水,处理请求就是桶中的的流出。漏桶法就是不管注入水(请求进入)的快慢如何,我只按照恒定的流水出水(处理请求)。
固定线程个数的线程池就是我们平时接触的最多的漏桶法限流的例子,这种情况中不管需要处理的任务有多少,线程池最多只会运行固定个数的任务,其余的任务要么被拒绝要么等待。

令牌桶算法

令牌桶算法就是系统会安装固定的速率往桶中添加令牌,请求的时候先到桶里拿一个令牌,如果能够拿到令牌就表示可以进行请求处理,如果桶里没有令牌了,就表明需要限流了。

在这里插入图片描述

常用限流库

  • Google的Guava工具集中有一个RateLimiter限流器,在令牌桶的算法基础上进行改良实现的。
  • 阿里开源的Sentinel也具有限流的功能,采用的是滑动窗口算法进行限流。

扫码关注
头条号:  微信公众号:

对限频限流的思考 ntro1:限流的常见实现方式及常见开源限流组件有注意点 intro2: 你真的理解了漏桶和令牌桶限流算法吗,划分/区分二者科学吗 intro2: 你知道限流保障服务可用时也可能导致其他服务不可用吗 早先看到朋友圈分享限频限流的文章,从中有些收获,不过笔者不打算赘述,想进一步探讨下限频限流,以及限频限流使用时可能遇到的问题,同时也是对前一篇博文的回应,或许看完本文你会对Guava令牌桶算法有不一样的理解。 什么是服务限流限频? 先看流量整形(traffic shaping)这个概念,wi... 阅读详情

相关推荐

java Sentinel限流秘籍:5步轻松掌握限流原理与实践

Sentinel 是阿里巴巴开源的一款高性能的流量控制组件,主要用于微服务架构中的流量控制、熔断降级、系统自适应保护等功能。它可以帮助我们保护系统免受过载的影响,确保系统的稳定性和可靠性。// 被保护逻辑// 限流之后的业务逻辑return "被限流了";// 定义资源和限流后触发的方法// 限流后触发的方法return msg;通过本文的详细介绍,相信大家已经学会了如何使用 Sentinel 来实现限流,保护我们的系统免受过载的影响。

java专栏 820

限流的几种方式及简单实现

计数器、信号量、滑动窗口、漏桶、令牌桶

千里之行,始于足下 1158

超越音频!STM32 SAI接口在AD7768高速ADC采集中的妙用(含PCB布局指南)

本文深入探讨了如何将STM32的SAI接口应用于AD7768高速ADC的数据采集系统,超越了其传统的音频应用范畴。文章详细解析了SAI协议与ADC时序的匹配方法,提供了从CubeMX配置、DMA数据搬运到关键PCB布局指南的完整实战方案,旨在帮助工程师实现稳定、高精度的工业级高速数据采集。

efc12345678的博客 304

服务容错之限流之 Tomcat 限流 & Tomcat 线程池的拒绝策略

最后再回过头看文章开头的两个问题:每次提到服务限流为什么都不考虑基于 Tomcat 来做呢?Tomcat 的确可以用来做限流,比如可以控制最大线程数,这样后续的任务均会在队列等待,并不会执行。从Connector的角度设置,这块不在本文探讨范围之内。可扩展性:基于 Tomcat 的限流方案通常只能在单个服务实例上工作,且只能针对HTTP/HTTPS协议的请。而在微服务或者分布式系统中,我们可能需要分布式限流方案和针对多协议的 限流。灵活性。

【欢迎关注公众号:冬瓜白】 1382

Isaac Sim 车辆动力学:从参数调优到户外仿真的挑战与实战

本文深入探讨了Isaac Sim在车辆动力学仿真中的应用,从参数调优到户外场景模拟的实战经验。详细解析了悬架系统、轮胎物理模型等核心参数的设置技巧,并分享了应对户外仿真挑战的实用方案。通过Vehicle Wizard高级使用和传感器配置,帮助开发者高效完成车辆仿真与算法开发。

weixin_29192211的博客 404

你需要这样一个Ros软路由—— 路由器+外网+一号通ip线路=动态ip的WiFi信号

功能强大 管理便捷—给您全新的路由体验 一键更换指定线路or批量更换所有IP/MAC/SSID 自定义走本地网络策略的分流功能 设备批发价、不限制拨号账号服务商 强大的单设备/多设备IP去重功能 批量导入、管理一号通线路 一键任意切换5G_WiFi(推荐)/2.4G_WiFi(建议不用) 设备支持PPTP/L2TP/SSTP/openVP.N等协议 独家支持openVPN,适用于网络受限用户 支持自行接入AP和交换机扩容 一键打开/关闭所有虚拟WiFi 一键隐藏/显示设备WiFi...

米粒儿 4258

限流、熔断、降级、线程池隔离

Java的限流方式、熔断降级、线程池隔离

tmax52HZ的博客 1452

模板匹配加速之金字塔分层搜索

图像金字塔是一种多分辨率图像表示方法,它通过一系列逐渐缩小或放大的图像来表示原始图像的不同尺度。高斯金字塔(Gaussian Pyramid):通过不断下采样(降采样)生成更小的图像。拉普拉斯金字塔(Laplacian Pyramid):通过高斯金字塔和差分操作生成一组残差图像。在模板匹配中,我们主要使用高斯金字塔来实现多尺度匹配。金字塔灰度模板匹配通过多尺度搜索策略,在保持较高准确率的同时显著提升匹配速度,尤其适用于:高分辨率图像处理实时检测系统移动端设备等资源受限场景。

weixin_44969144的博客 1732

万字带你搞懂Java架构-限流技术设计

上面通过案例介绍了几种常用的限流实现,不过细心的同学可以看到,这些限流的实现都是在具体的工程模块中嵌入的,事实上,在真实的微服务开发中,一个项目可能包含了众多的微服务模块,为了减少重复造轮子,避免每个微服务模块中单独实现,可以考虑将限流的逻辑实现封装成一个SDK,即作为一个springboot的starter的方式被其他微服务模块进行引用即可。该类的实现思路与上述使用guava类似,不同的是,这里使用的是sentinel原生的限流相关的API,对此不够属性的可以查阅官方的文档进行学习,这里就不展开来说了。

wdj_yyds的博客 1062

从零组装一台会‘看’的无人机:手把手教你配置NUC机载电脑与D435深度相机(环境搭建篇)

本文详细介绍了如何从零开始组装一台具备视觉能力的智能无人机,重点讲解了NUC机载电脑与D435深度相机的配置方法。通过Ubuntu系统安装、ROS环境搭建、深度学习框架配置等步骤,帮助开发者实现无人机的自主避障和目标跟踪功能。文章还提供了性能优化和常见问题解决方案,是无人机视觉系统开发的实用指南。

weixin_30915275的博客 398

毕设助力!从0到1构建基于YOLO的家居安防异常活动监测系统,让你的毕设守护家庭安全

做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护生活”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了家居安防的哪些痛点、对比了不同YOLO模型的性能差异、系统未来能怎么优化(比如对接智能门锁/报警器、实现语音交互)。未来,这个系统还能往“更智能”的方向发展:比如结合行为分析判断异常意图、开发移动端APP实现全屋设备联动、在智慧社区中实现多家庭联防……想象空间很大。

LXY_LOVE36的博客 124

老司机带你聊聊接口限流!!!

导读 前几天和一个朋友讨论了他们公司的系统问题,传统的单体应用,集群部署,他说近期服务的并发量可能会出现瞬时增加的风险,虽然部署了集群,但是通过压测后发现请求...

码猿技术专栏 1973

基于深度学习的航拍图像中地物变化检测

随着无人机技术的飞速发展,航拍图像成为获取地表信息的重要手段之一。然而,由于地球表面的不断变化,监测和识别航拍图像中的地物变化成为一项具有挑战性的任务。在人工智能领域,深度学习技术的兴起为地物变化检测提供了全新的解决方案。本文将介绍基于深度学习的航拍图像中地物变化检测的方法,并附上相应的代码实例。

一键难忘的博客 4177

简单聊聊 限流算法

限流算法

sjdxx的博客 403

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

常见的限流算法及其原理剖析

1 何谓限流 限流,顾名思义,便是限制流量的意思。系统规定在一段时间内只能进入这么多的流量,如果超过限额的话,那就不好意思了,我这个系统接受不了。通过限流算法,我们可以控制系统的 qps,更好地对系统提供保护。 本文致力于介绍几种我们常用的限流算法,同时会对其原理进行一定程度的剖析,希望大家能有所收获。 2 计数器算法 算法原理 计数器算法是最简单的限流算法,假设我们规定 A 接口在1小时之内的访...

Geffin的博客 1400

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

springboot并发量_「聊聊高并发 一」限流篇

「聊聊高并发 一」限流篇高并发系统保护的三把利器 : 缓存、降级和限流缓存 缓存的目的是提升系统访问速度和增大系统处理容量降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理今天呢,咱们主要来聊一聊限流对于比较关键...

weixin_39723655的博客 1464

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JAVA面试场景题:一、项目中的限流是怎么做的?

本文从底层原理层分析限流是什么,为什么要限流及限流的技术原理。包括常见的限流算法、单机限流场景、分布式限流场景以及一些常见限流组件。

weixin_40841143的博客 1367

十分钟搞懂限流及常见方案!

你好,我是田哥最近,收到几位网友的面试反馈,都在面试中被问到限流相关问题,咱们今天就来聊聊我们项目中的各种限流解决方案。限流基本概念 对一般的限流场景来说它具有两个维度的信息:时间 限流基于某段时间范围或者某个时间点,也就是我们常说的“时间窗口”,比如对每分钟、每秒钟的时间窗口做限定资源 基于可用资源的限制,比如设定最大访问次数,或最高可用连接数上面两个维度结合起来看,限流就是在某个时间窗口对资源...

田维常 814

高并发限流方案,你用过哪几种?哪种最好?

文章来源:https://juejin.cn/post/7145435951899574302目录前言常用限流方式限流对比前言在电商高并发场景下,我们经常会使用一些常用方法,去应对流量高峰,比如限流、熔断、降级,今天我们聊聊限流。什么是限流呢?限流是限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则通过拒绝服务的方式保证整体系统的可用性。根据限流作用范围,可以分...

架构师小秘圈 296

服务限流,我有 6 种实现方式…

总的来说,要保证系统的抗压能力,限流是一个必不可少的环节,虽然可能会造成某些用户的请求被丢弃,但相比于突发流量造成的系统宕机来说,这些损失一般都在可以接受的范围之内。前面也说过,限流可以结合熔断、降级一起使用,多管齐下,保证服务的可用性与健壮性。

IT_1024的博客 1042

限流:深入理解微服务高可用三板斧“限流”

限流顾名思义,就是对请求或并发数进行限制;通过对一个时间窗口内的请求量进行限制来保障系统的正常运行。如果我们的服务资源有限、处理能力有限,就需要对调用我们服务的上游请求进行限制,以防止自身服务由于资源耗尽而停止服务。在限流中有两个概念需要了解。阈值:在一个单位时间内允许的请求量。如 QPS 限制为10,说明 1 秒内最多接受 10 次请求。拒绝策略:超过阈值的请求的拒绝策略,常见的拒绝策略有直接拒绝、排队等待等。

为无为,事无事,味无味。 1714

架构设计之服务限流

限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。 v服务限流概念 在介绍限流概念之前,我们先来聊聊身边有哪些限流,如果有在帝都的码农估计对限流是最深有感触的,帝都...

paolei的笔记 953

滑动窗口限流 java_Java后端精选技术:高并发场景下的限流策略

在高并发的场景下,我们的优化和保护系统的方式通常有:多级缓存、资源隔离、熔断降级、限流等等。今天我们来聊聊限流。为什么需要限流举个比较简单的例子,正常来说,一个员工A他每天能够处理的工作是10个,突然某一天来了100个工作量,这时候,如果员工A还处理100个,只有一种可能,这个员工被压垮。如果我们能预先知道会有100个任务会来,我们通过增加员工数或定义消息队列等等来临时解决。但是我们很多时候无法预...

weixin_39640395的博客 225

这么多开源的限流框架,该宠幸谁呢?

大家好,架构摆渡人。这是我的第4篇原创文章,还请多多支持。 限流一直就是一个比较热门而又老旧的话题,但是作为应对高并发的手段之一,限流的热度一直都在。 前面我们大概的介绍了限流的背景,主流的限流算法,以及到底是选择自研还是选择开源的框架来实现限流功能,相关文章可以翻阅历史记录进行查看。 自研这条路没有一定的实力真的不好走,大多数的选择估计都是开源。那么我今天就介绍几款用的比较多的限流框架给大家。 Guava Guava里自带了Ratelimiter用于限流,该类基于令牌桶算法实现流量限制功能。接入呢也比较简

809

java服务限流_Java实现系统限流

在微服务系统中,缓存、限流、熔断是保证系统高可用的三板斧,今天我们就来聊聊限流。限流是保障系统高可用的方式之一,当然啦也是大厂高频面试题,如果阿里的面试官问一句:“如何实现每秒钟1K个请求的限流?”,你要是分分钟给他写上几种限流方案,那岂不香哉,哈哈:smirk:! 话不多说,我来列几种常用限流实现方式。Guava RateLimiterGuava是Java领域很优秀的开源项目,包含了日常开发常...

weixin_42367233的博客 579
上一篇: Java内存泄漏!为什么会泄漏?如何泄漏?怎么定位?
下一篇: Golang中的defer关键字的用法、原理以及它的坑
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值