剖析常见的限流算法:计数器法、漏桶和令牌桶算法

高并发策略之限流计数器令牌桶 三大算法的原理与实战(史上最全) 限流,降级熔断是应对互联网高并发场景的方案之一,也是尝尝被问道的部分,今天单独讲一下【限流】的算法实现。 阅读详情

对于业务系统来说高并发就是支撑「海量用户请求」,QPS 会是平时的几百倍甚至更高。
如果不考虑高并发的情况,即使业务系统平时运行得好好的,并发量一旦增加就会频繁出现各种诡异的业务问题,比如,在电商业务中,可能会出现用户订单丢失、库存扣减异常、超卖等问题。

限流是服务降级的一种手段,顾名思义,通过限制系统的流量,从而实现保护系统的目的。

合理的限流配置,需要了解系统的吞吐量,所以,限流一般需要结合容量规划和压测来进行。

当外部请求接近或者达到系统的最大阈值时,触发限流,采取其他的手段进行降级,保护系统不被压垮。常见的降级策略包括延迟处理、拒绝服务、随机拒绝等。

常见的限流方式,比如Hystrix适用线程池隔离,超过线程池的负载,走熔断的逻辑。在一般应用服务器中,比如tomcat容器也是通过限制它的线程数来控制并发的;也有通过时间窗口的平均速度来控制流量。常见的限流纬度有比如通过Ip来限流、通过uri来限流、通过用户访问频次来限流。

一般限流都是在网关这一层做,比如Nginx、Openresty、kong、zuul、Spring Cloud Gateway等;也可以在应用层通过Aop这种方式去做限流。

1. 计数器法

一般来说,我们进行限流时使用的是单位时间内的请求数,也就是平常说的 QPS,统计 QPS 最直接的想法就是实现一个计数器。

计数器法是限流算法里最简单的一种算法,我们假设一个接口限制 100 秒内的访问次数不能超过 10000 次,维护一个计数器,每次有新的请求过来,计数器加 1。

这时候判断,

  • 如果计数器的值小于限流值,并且与上一次请求的时间间隔还在 100 秒内,允许请求通过,否则拒绝请求
  • 如果超出了时间间隔,要将计数器清零

相信大家都知道有一个弊端:如果我在单位时间100s内的前10s,已经通过了10000个请求,那后面的990s,只能眼巴巴的把请求拒绝,我们把这种现象称为“突刺现象”

计数器策略进行限流,可以从单点扩展到集群,适合应用在分布式环境中。

单点限流使用内存即可,如果扩展到集群限流,可以用一个单独的存储节点,比如 Redis 或者 Memcached 来进行存储,在固定的时间间隔内设置过期时间,就可以统计集群流量,进行整体限流。

计数器策略还有有一个很大的缺点,对临界流量不友好,限流不够平滑。

假设这样一个场景,我们限制用户一分钟下单不超过 10 万次,现在在两个时间窗口的交汇点,前后一秒钟内,分别发送 10 万次请求。也就是说,窗口切换的这两秒钟内,系统接收了 20 万下单请求,这个峰值可能会超过系统阈值,影响服务稳定性。

对计数器算法的优化,就是避免出现两倍窗口限制的请求,可以使用滑动窗口算法实现,感兴趣的同学可以去了解一下。
下面的代码里使用 AtomicInteger 作为计数器,可以作为参考:

public class CounterLimiter {
   
    
    //初始时间 
    private static long startTime = System.currentTimeMillis(); 
    //初始计数值 
    private static final AtomicIntege
高并发,不怕不怕「限流算法第一把器:计数器 简单理解就是在1秒之内有1000个请求(流量)来了,而系统只能处理100个/秒,那么这时候明显是无处理过来的,很显然就会导致系统瘫痪了,那么对于这个请求流量,我们可以做一个限制,配置最多可接受的请求是100个/秒,多出来的请求,怎么办呢,那就限制住,直接返回一个提示,当前请求人数过多,请稍后再试,这就是限流(限制在某个时间窗口的最大流量)。说明上面代码逻辑很简单,就是在1秒之内进行统计请求的总个数,然后校验请求的个数是否超过了限制的请求数,如果在1秒之外,那么就重置请求数。... 阅读详情

相关推荐

说说以下三种限流算法的联系与区别:计数器算法算法令牌桶算法

本文探讨了在高并发场景下防止突刺现象的限流算法,包括算法令牌桶算法。通过示意图解释了这两种算法的工作原理,并建议在竞争激烈的环境中使用LongAdder,以降低多线程对临界资源的竞争,提高性能。文章深入分析了AtomicLong与LongAdder在并发自增操作上的差异,指出LongAdder利用分段思想减少了锁竞争,提高了系统效率。

以0和1为基因,在赛博空间搭建诗意的代码迷宫;用AI与算法作羽翼,在数字穹顶下翱翔创新的无垠天际。这里有前沿技术的深度拆解,有编程美学的多维探索,邀您共赴一场科技与诗意交织的未来盛宴。 612

令牌桶算法算法,与计数器算法限流算法与Guava RateLimiter源码解析.docx

在分布式系统中,应对高并发访问时,缓存、限流、降级是保护系统正常运行的常用方。当请求量突发暴涨时,如果不加以限制访问,则可能导致整个系统崩溃,服务不可用。同时有一些业务场景,比如短信验证码,或者其它第三方API调用,也需要提供必要的访问限制支持。还有一些资源消耗过大的请求,比如数据导出等(参考 记一次线上Java服务CPU 100%处理过程 ),也有限制访问频率的需求。

4种限流算法 详解

负载均衡将请求均衡地分发到各个服务节点,避免节点出现过载或饥饿的现象。常用的负载均衡算法有轮询(Round Robin)、随机(Random)、加权随机(Weight Random)、最小连接(Least Connections)、源地址哈希(Hash)等。分流不同流量,分而治之,避免相互不影响。如主次分离、读写分离、动静分离等。限 流过载保护,流控防雪崩。常见算法计数器算法、滑动窗口算法算法令牌桶算法等,下面会详细讲到。降 级非核心链路让步,优先保障核心链路。......

JineD的博客 1669

【金九银十必问面试题】不得不说的的限流算法 ——令牌桶限流算法 ,如何让面试官眼前一亮!

当面试官问你,“什么是令牌桶限流算法”!你知道要怎么回答,才能获得面试官的青睐吗?大家好,我是Mic,一个工作了14年的Java程序员。关于这个问题,面试官想考察哪些纬度?我们又该怎么回答呢?

跟着Mic学架构 414

限流计数器算法

一点睛 发生过载的原因主要是缓冲区满,导致处理的请求超时。所以限制流量,尽早拒绝过载状态的请求,能够保证服务尽量处理负载过程中的请求。 限流的主要方有下面四种: 计数器算法 滑动窗口算法 算法 令牌桶算法 本篇介绍计数器算法。 二算法 计数器算法是在一定的时间间隔里,记录请求次数,当请求次数超过该时间限制时,就把计数器清零,然后重新计算。当请求次数超过间隔内的最大次数时,拒绝访问。 例如:一个接口每分钟允许访问100次。实现方式如下: 1设置一...

实践求真知 2594

限流计数器令牌桶 三大算法的原理与实战(史上最全)

限流是面试中的常见的面试题(尤其是大厂面试、高P面试)。以微博为例,访问从平时的50万增加到了500万,系统的规划能力,最多可以支撑200万访问,那么就要执行限流规则,保证是一个可用的状态,不至于服务器崩溃。

架构师尼恩 2万+

限流常用算法&实现

在当前窗口结束的位置有100个请求,时间超过了50S后,又来100个请求,此时由于窗口向前滑动了一小格,所以此时窗口内的请求是100,如果此时有请求进来,则大于100,那么他会把请求都会拒绝,直到窗口滑出50S的时间节点。例如在40S~60S期间来了200个请求,导致20S内大量请求通过限流检查,给一个系统突然的峰值,而这个时间范围越小,峰值越高,就会导致系统的崩溃。缺点:存在窗口切换时的突增问题,即在时间窗口的临界点附近,如果请求数突然增加,可能会导致短时间内大量请求通过限流检查,从而对系统造成压力。

qq_39308587的博客 222

令牌桶:Resilience4j限流算法背后的数学之美

本文深入探讨了Resilience4j中的令牌桶限流算法,解析其数学模型、实现差异及适用场景。通过详细的技术实现性能对比,帮助开发者在高并发场景下选择合适的流量控制策略,提升系统稳定性与性能。

study的专栏 547

限流算法详解(固定窗口、滑动窗口、令牌桶、Redis分布式限流

限流是保护系统的第一道防线。为什么需要限流令牌桶有什么区别?滑动窗口如何实现?Redis如何做分布式限流?理解固定窗口的临界问题、滑动窗口的精确控制、的匀速输出、令牌桶的突发流量、Redis的Lua脚本限流,才能掌握接口防护的本质。从"接口被刷导致服务崩溃"的故障出发,剖析四大限流算法的核心原理。通过固定窗口的临界突刺问题、滑动窗口的时间分片、的恒定速率、令牌桶的突发处理、Redis+Lua的分布式限流,揭秘从单机到分布式的限流方案。配合详细代码实现与性能对比,给出限流策略的最佳实践。

比较是偷走幸福的小偷 1205

Go语言实现高性能限流器:令牌桶算法详解

限流,顾名思义,就是限制流量。用生活中的例子来说,限流就像是控制水龙头的流量,避免水流过大导致水槽溢出。在计算机系统中,限流是指控制单位时间内访问或处理请求的数量,防止系统因请求过多而崩溃。为什么需要限流呢?保护系统资源:任何系统的处理能力都是有限的,无限制的请求会导致资源耗尽防止服务雪崩:一个服务崩溃可能引发连锁反应,导致整个系统瘫痪提供服务质量保证:为核心业务预留足够资源,确保关键功能正常运行应对恶意攻击:限制可疑IP的请求频率,有效应对DDoS等攻击控制成本。

sinat_27016095的博客 1278

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

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

Geffin的博客 1394

Java限流算法全解析:从计数器令牌桶的实战指南

在高并发与分布式系统中,流量控制是保障服务稳定性的核心技术。其核心原理是通过预设规则,将请求速率限制在系统可承受的阈值内,防止因流量洪峰导致的系统雪崩,从而确保服务的高可用性。从技术价值看,有效的限流不仅是系统过载保护的最后防线,更是进行容量规划与资源管理的基础。常见的应用场景包括微服务网关、核心API保护以及秒杀等瞬时高并发业务。本文聚焦于Java生态下的主流实现方案,深入剖析计数器、滑动窗口、令牌桶四种经典算法的原理、实现与选型。其中,令牌桶算法凭借其兼顾流量平滑性与突发处理能力的优势,结合Re

weixin_34221775的博客 1933

JCSprout限流算法终极指南:令牌桶算法的完整实现

在高并发场景下,限流是保障系统稳定性的关键技术。JCSprout项目提供了全面的限流解决方案,本文将深入解析两种核心限流算法——算法令牌桶算法的原理与实现,帮助开发者快速掌握限流技术。 ## 为什么需要限流? 随着业务增长,系统面临的流量压力越来越大。当请求量超过系统处理能力时,可能导致服务响应缓慢甚至崩溃。限流技术通过控制请求速率,确保系统在安全范围内运行,是高并发系统不可或缺的防护手

gitblog_00281的博客 825

架构思维:重温限流算法原理与实战

文章摘要:限流是保障高并发系统稳定的核心手段。本文深入解析四大主流限流算法计数器算法简单直接但存在临界问题;滑动窗口算法通过细分时间窗口解决临界问题;令牌桶算法提供更精细的流量控制。重点剖析计数器算法的实现代码及缺陷,并对比了固定窗口与滑动窗口的特性差异。这些算法各有适用场景,合理选择能有效应对突发流量,防止系统过载,是构建高可用架构的关键技术。

小工匠 1501

限流的方,Redis 计算器限流算法、滑动时间窗口限流算法限流算法令牌桶限流算法,Java 开发

限流的方,Redis 计算器限流算法、滑动时间窗口限流算法限流算法令牌桶限流算法,Java 开发

道友 426

常见限流算法(计数器算法,滑动时间窗口算法令牌桶算法限流算法)

固定窗口限流算法(Fixed Window Rate Limiting Algorithm)是一种最简单的限流算法也叫计数器,其原理是在固定时间窗口(单位时间)内限制请求的数量。该算法将时间分成固定的窗口,并在每个窗口内限制请求的数量。具体来说,算法将请求按照时间顺序放入时间窗口中,并计算该时间窗口内的请求数量,如果请求数量超出了限制,则拒绝该请求。假设单位时间(固定时间窗口)是1秒,限流阀值为3。在单位时间1秒内,每来一个请求,计数器就加1,如果计数器累加的次数超过限流阀值3,后续的请求全部拒绝。

qq_42600094的博客 3043

【Java主流电商秒杀方案】百万qps秒杀方案简述(文字版配代码、视频详解)20w商品,100W预约,前后端如何处理(令牌桶,redis 分片,商品分片,分布式锁,配置中心 Apollo、Nacos)

1. 需要解决的问题 1. 高并发,重复刷接口 对服务器的负载冲击 2. 高并发,带来的超卖,需要控制商品数量 3. 高负载 下单速度成功率的保障 2. 正常秒杀流程 1. 等待抢购(正常提前1周) 2. 预约 3. 等待抢购 4. 抢购 3 秒杀商品规模 预计预约人数(20W商品,预约100W人) 20个实例 4 主流秒杀方案 4.1 针对预约人数过多,如何降低抢购时的压力 通过给预约用户提前发放token,20w的库存,发30w个token 把token放在用户cookie中 1.有toke

alwarse 3773

限流令牌桶算法

令牌桶限流算法的核心思想是:系统维护一个令牌桶中的令牌以固定速率生成。当有请求到来时,需要从中取出一定数量的令牌,只有取出成功,请求才能被处理。如果中的令牌不足,请求则被拒绝或者等待。平滑流量:令牌桶算法可以平滑地控制请求速率,避免流量突刺对服务造成影响。弹性处理能力:当中有足够的令牌时,可以应对短时间内的流量突增。公平性:令牌桶算法可以保证每个请求都有机会被处理,避免某些请求长时间得不到响应。令牌桶限流算法是一种简单而有效的流量控制方

无限进步的博客 441
上一篇: 找到最大的矩阵面积 java
下一篇: 每个公司有自己的数据库 公司用相同的系统 多租户
Justdoforever
博客等级 码龄9年 2010粉丝 201原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值