跳转至

限速器

限速器简介

限速器 (Rate Limiter) ,在网络系统中,限速器可以控制客户端发送流量的速度,比如 TCP, QUIC 等协议;而在 HTTP 的世界中, 限速器可以限制客户端在一段时间内发送请求的次数,如果超过设定的阈值,多余的请求就会被丢弃

限速器(Rate Limiter)有很多好处,可以防止一定程度的 Dos 攻击,也可以屏蔽掉一些网络爬虫的请求,避免系统资源被耗尽,导致服务不可用

限速器的设计要求:

  • 低延迟,性能要好
  • 需要适用于分布式场景
  • 用户的请求受到限制时,需要提示具体的原因
  • 高容错,如果限速器故障,不应该影响整个系统

系统中的集成方式

从系统整体的角度上来看,我们的限速器应该放在哪里?通常有三种选择,如下

  • 客户端

是的,我们可以在客户端设置限速器。但是有个问题是,我们都知道在 Web 前端做一些限制实际上是不安全的,同样客户端也是一样的, 限速客户端可以做,但是远远不够

  • 服务端

在服务端设置限速器是很常见且安全的,如下

图片

  • 中间件

还有一种做法是,我们可以提供一个单独的限速中间件,如下

图片

假如限速器设置了每秒最大允许 2 个请求,那么客户端发出的多余的请求就会被拒绝,并返回 HTTP 状态码 429, 表示用户发送了太多的请求

图片

实际上,很多网关都有限速的实现,包括认证、IP 白名单功能

限速算法

下面是几种经典的限速算法:

  • 令牌桶 (Token bucket)
  • 漏桶(Leaking bucket)
  • 固定窗口计数器(Fixed window counter)
  • 滑动窗口日志(Sliding window log)
  • 滑动窗口计数器(Sliding window counter)

参考资料