当前位置: 首页 > Web前端 > HTML

大型网站限流算法的实现与改造

时间:2023-04-02 17:29:02 HTML

最近在写一个限流插件,难免接触到一些限流算法。本文将对这些常见的限流算法进行分析。在分析之前,根据我个人的理解,限流应该足够灵活,每个接口都要做。比如一个类有5个接口,那么我的限流插件应该可以对每个接口实现不同的限流方案。所以,既然是针对每一个接口,就需要一个能唯一标识这个接口的key(我取的是类名+方法名+入参)。分布式限流强烈推荐使用redis+lua或者nginx+lua来实现。这里以两个限流条件为例说明常见的限流算法:接口1允许10秒内最多访问100次,接口2允许每个人10秒内最多访问100次。计数器算法该算法可以说是限流算法中最简单的算法。核心思想计数器算法的意思是,当在一个时间单元内访问接口时,我会记录访问次数,直到访问次数达到上限。涉及变量接口(key)时间单位(expire)允许访问多少次(limit)访问次数(value)条件——当有请求到来时,我们会拿到key。如果(键存在){值++;if(value>=limit){无法访问}}else{添加key,value为1,设置key过期时间为expire}条件2既然条件1已经实现了,那么条件2会不会很复杂呢??与条件一相比,同一个key对应多个用户。那么我们只需要将用户的信息添加到密钥中即可。例如key_user1、key_user2。漏桶算法的核心思想是,漏桶算法是指一个接口在一个时间单位内被允许访问的次数是动态变化的(如果一分钟内允许60次访问,那么只有59秒从开始计时开始,不管是否被访问过)允许访问59次,30秒内只允许访问30次)。为什么会这样呢,因为另一个线程在进行递减操作涉及到变量接口(key)时间单位(expire)允许访问多少次(limit)递减间隔(interval)递减步长(step)剩余访问次数(value)Key访问时间(lastUpdateTime)当前时间(nowTime)(注意nowTime的值应该是应用获取的时间,不是redis或者nginx获取的时间)