限流算法:常见的三种限流

开发者 2024-8-31 18:13:47 63 0 来自 中国
spring Boot 接口怎样限流?限流的几种方式

场景

在一个高并发体系中对流量的把控好坏常告急的,当巨大的流量直接哀求到我们的服务器上没多久就大概造成接口不可用,不处理惩罚的话以致会造成整个应用不可用。
常用算法有:计数算法、漏桶算法令牌桶算法,最常用的算法是后两种。
1.计数算法

计数器法是限流算法里最简朴也是最容易实现的一种算法。比方体系能同时处理惩罚10000个哀求,将该值生存一个计数器,处理惩罚一个哀求,计数器加一,处理惩罚完一个计数器减一。
每次哀求时先判断下计数器的值,如果高出阈值则拒绝。
长处:简朴粗暴,单机在Java中可用Atomic等原子类,分布式就用Redis incr。
缺点:假设体系设置的阈值是10000,当前计数器为0,大概在某一秒内10000个哀求同时访问进来,突发的流量大概刹时击垮服务。对步调来说迟钝增长处理惩罚和瞬时并发是不一样的。
2.漏桶算法

漏桶算法相对前面的计数算法更加柔性,它的原理也很简朴,可以以为就是注水漏水的过程。
漏桶接受以恣意速率流入的水,而且以固定速率将水流出。当水高出桶的容量时,会被溢出,也就相称于被扬弃。漏桶算法包管了团体的速率。


  • 流入漏桶的水滴,看作是访问体系的哀求,这个流入速率是不确定的。
  • 桶的容量表现体系当前所能处理惩罚的哀求数。
  • 如果桶的容量满了,就到达了限流的阈值,此时再有水滴将会被扬弃(拒绝哀求)。
  • 流出的水滴,是匀速恒定的,按照服务设定的固定速率处理惩罚哀求。
漏桶算法原理与消息队列头脑有些雷同,都是举行削峰填谷,颠末漏桶后哀求就能匀速平滑的流出,但现实上它的长处也是缺点。
面临突发哀求,服务的处理惩罚速率和平常一样,这实在不是我们想要的。我们更想要的是面临突发流量时,在体系安稳运行的同时又能更快的处理惩罚哀求,而不是不停按照同一的速率来处理惩罚。
相对利弊也是分使用场景的,漏桶算法,告急用来掩护别人的接口。
令牌桶算法

令牌桶算法是对漏斗算法的一种改进,除了可以或许起到限流的作用外,还答应肯定水平的流量突发。
令牌桶算法告急时匀速的增长可用令牌,令牌数由于桶的限定有数目上线。
哀求拿到令牌,相称于拿到了授权,即可举行相应的业务操纵。
与漏桶算法相比,有大概导致短时间内的哀求数上升(由于拿到令牌后,就可以访问接口,存在一刹时将全部令牌拿走的环境),但不会有计数算法那样高的峰值(由于令牌数目是匀速增长的)。以是在应对突发流量的时间令牌桶表现的更佳
一样平常自己调用自己的接口,接口会有肯定的伸缩性,令牌桶算法,告急用来掩护自己的服务器接口。
结论


  • 想要到达限流的目的,又不会掐断流量,使得流量更加平滑?可以思量漏桶算法!须要留意的是,漏桶算法通常设置一个FIFO的队列使用以到达答应限流的作用。由于速率固定,纵然在某个时间卑鄙处理惩罚本领过剩,也不能得到很好的使用,这是漏桶算法的一个短板。
  • 限流和瞬时流量实在并不抵牾,在大多数场景中,短时间突发流量体系是完全可以接受的。令牌桶算法就是不二之选了,令牌桶以固定的速率v产生令牌放入一个固定容量为n的桶中,当哀求到达时实行从桶中获取令牌。当桶满时,答应最大瞬时流量为n;当桶中没有剩余流量时则限流速率最低,为令牌天生的速率v。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-12-4 01:30, Processed in 0.178488 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表