限速器
限速器简介
限速器 (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)