token bucket
基于计数的方式进行限制,类似于信号量semaphore,每次请求都需要先获取一个token,如果取完了,就不能请求。token会定时增加。
固定窗口
基于时间窗口,如秒,分钟,小时等,通过计数的方式来控制,优点是简单,缺点是对于边界无法精确控制次数,可能超出原有阈值的两倍
滑动窗口
每次请求记录请求时间,统计某个时间窗口内请求次数,并删除这个时间范围之前的所有请求记录数据。
一般可以用redis的sorted set来记录。方式如下
1
2
3
4zremrangebyscore key 0 now - TTL
zcount key now-TTL now
zadd key now now
expire key ttl分布式
如果高并发情况下,上述方式可能不够精确,如果需要完全准确计数,需要使用redislock来保证一致性。但是会牺牲性能。
Reference
https://blog.figma.com/an-alternative-approach-to-rate-limiting-f8a06cf7c94c
https://blog.figma.com/an-alternative-approach-to-rate-limiting-f8a06cf7c94c