• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

限流

互联网 diligentman 1周前 (11-20) 6次浏览

解决问题对象: 并发流量

解决方案:
1、计数器:
2、滑动窗口计数器:redis,zset数据结构,权重score存时间戳,使用rangeByscore查询指定时间段内的
3、漏桶:
4、令牌桶:

刚才去查了一些资料 好像redis基本都直接提供了 或者说结构可以实现 这几个限流

简单计数器:hash 存timestamp 和 count,每次进去在距离timestamp不足指定时差timeLimit时,判断count是否大于countLimit,大于阻止访问,否则累加count;超过timeLimit时,重置timestamp 和 count

窗口计数器:zset value和score都存timestamp,每次请求先移除窗口期timeLimit之前的记录,对窗口期内的记录总数count与countLimit做比较,如果超出了,阻止访问

漏桶:Redis 4.0 提供了一个限流 Redis 模块,名称为 redis-cell,该模块提供漏斗算法,并提供原子的限流指令 这个稍微有点不好理解,我要再看看

令牌桶:list当做桶,length当做令牌数,或者初始化一个普通key-value,value存令牌数,如果length和value <= 0 则阻止访问,否则pop或decr  另开一个常驻任务  按固定速率push或者incr  length或value=令牌上限则停止加牌,用while+sleep来完成这个加牌过程

漏桶:视用户的请求为水,发起请求是向桶内注水,处理请求是出水。这个过程跟令牌桶相反。  
  
令牌桶是初始化为满桶令牌,漏桶是初始化为空桶水  
  
令牌桶【资格】是空桶则阻止请求,漏桶【负载】是满桶阻止请求  
  
令牌桶的加桶速率是  每 1/qps 秒+1,取牌速率跟请求同步; 漏桶的出水速率是qps,注水速率跟请求同步  
  
  
令牌桶另开任务加牌(加资格),漏桶另开任务出水(消化请求)  
  
这里好奇初始化桶的容量该是多少 QPS? QPS = 并发量/平均响应时长

答案:并发

程序员灯塔
转载请注明原文链接:https://www.wangt.cc/2020/11/%e9%99%90%e6%b5%81/
喜欢 (0)