限流是指调节特定客户端对联网服务发出请求数量的技术。它限制了请求的总数和/或频率。
您可能希望向您的 API 添加限流器有很多原因,无论是为了防止有意还是无意的 API 滥用,限流器都能在门口阻止这些入侵者。让我们思考一些限流器可以助您渡过难关的场景:
- 如果您曾在一家基于 API 的初创公司工作,您就知道要想取得进展,需要提供一个“免费”套餐。免费套餐能让潜在客户试用您的服务并口口相传。但如果不限制免费套餐用户,您可能会有失去初创公司仅有的付费客户的风险。
- 与您的 API 进行程序化集成可能会存在 bug。有时资源耗尽并非恶意攻击所致。这些 FFDoS(“友军火力”拒绝服务)攻击发生的频率超出您的想象。
- 最后,每天都有恶意行为者招募机器人,让 API 提供商的日子不好过。能够在这些攻击影响您的用户之前检测并遏制它们,可能关系到我们业务的生死存亡。
限流通常在服务器端实现,但如果您控制着客户端,也可以在该点预先阻止某些类型的访问。它依赖于以下三个特定的信息片段:
- 谁发起了请求:识别攻击或滥用的来源是其中最重要的部分。如果无法将恶意请求分组并关联到单一实体,您将束手无策。
- 请求的成本是什么:并非所有请求都具有同等价值,例如,绑定到单个账户数据的请求,可能只会造成局部破坏,而跨越多个账户和/或长时间(例如多年)的请求则昂贵得多
- 他们的分配配额是多少:允许用户发出请求的总数和/或请求速率是多少。例如,对于“免费套餐”,您可能会给他们更小的请求配额/桶,或者在特定高峰时段减少他们的配额。
由于以下几个原因,Redis 特别适合作为实现限流的平台:
- 速度:限流实现所需的检查和计算会增加 API 的总请求-响应时间,您希望这些操作尽可能快地完成。
- 中心化和分布式:Redis 可以将您的单服务器/实例设置无缝扩展到数百个节点,而不会牺牲性能或可靠性。
- 恰当的抽象:Redis 提供优化的数据结构来支持几种最常见的限流器实现,并且通过其内置的 TTL(生存时间控制)功能,可以高效地管理内存。计数是 Redis 的一项内置功能,也是 Redis 在竞争中脱颖而出的众多领域之一。
现在,让我们开始第一个实现;简单的 “固定窗口”实现。