一、计数器算法
固定时间内计数:固定时间,允许通过的请求
1.优点
- 简单,易于实现
2.缺点
- 存在临界问题
如果流量在1s内最后100ms进入100个,后900ms又进入100个,等于是1s内进入200个,服务直接崩了
无时间段限制计数:类似semaphore信号量;并发量最高限制在你想要的范围内。
二.固定时间窗口算法
实际上是将固定时间通过请求中的时间进行细分,例如1s进行5等分
这种也会存在临界值问题,和固定时间段计数类似,可能会产生2N的阈值流量
三、滑动窗口算法
这个是针对固定窗口,临界值问题一个好的策略。1s切成5等分之后,每个小窗口是200ms,一个周期去除掉一个200ms.
初始窗口期:0-1s:第一个时间窗口的0.8s-1s的进来5个请求,打满
过了一个时间周期,窗口是:0.2-1.2s,此是0.9在这个时间段内,多余请求拒绝
1.优点
- 解决了固定窗口临界问题
2.缺点
- 不能应对突发大流量
- 要求窗口尽量细
四、漏斗算法
实际上就是:宽进严出,进来的流量都在漏斗上面排队,流出按照固定速率。
这种无法面对突发流量,容易造成用户长时间等待
五、令牌桶算法
这种实际上是匀速流入,快速流出。当令牌桶满的时候就无法放,被拒绝。
六、nginx对于限流配置
- 配置限流
limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;
server {
location / {
limit_req zone=test;
}
}
1.limit_req_zone $binary_remote_addr zone=test:10m指定限流共享空间和名称
2.rate=2r/s指定限流速率
- 漏斗配置
limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;
server {
location / {
limit_req zone=test brust=5;
}
}
brust=5给一个5个流量的桶
- 处理突发流量(切换令牌桶)
limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;
server {
location / {
limit_req zone=test brust=5 nodelay;
}
}
nodelay 参数表示消费桶里所有请求,但是流入的速度还是2r/s