限流ratelimit

  1. token bucket

    基于计数的方式进行限制,类似于信号量semaphore,每次请求都需要先获取一个token,如果取完了,就不能请求。token会定时增加。

  2. 固定窗口

    基于时间窗口,如秒,分钟,小时等,通过计数的方式来控制,优点是简单,缺点是对于边界无法精确控制次数,可能超出原有阈值的两倍

  3. 滑动窗口

    每次请求记录请求时间,统计某个时间窗口内请求次数,并删除这个时间范围之前的所有请求记录数据。

    一般可以用redis的sorted set来记录。方式如下

    1
    2
    3
    4
    zremrangebyscore key 0 now - TTL
    zcount key now-TTL now
    zadd key now now
    expire key ttl
  4. 分布式

    如果高并发情况下,上述方式可能不够精确,如果需要完全准确计数,需要使用redislock来保证一致性。但是会牺牲性能。

Reference

https://blog.figma.com/an-alternative-approach-to-rate-limiting-f8a06cf7c94c

https://blog.figma.com/an-alternative-approach-to-rate-limiting-f8a06cf7c94c