学习

如何在 Spring 应用程序中使用 Redis 实现速率限制

在本系列微型教程中,我们将探讨几种使用 Redis 在 Spring 应用程序中实现限速的方法。我们将从最基本的 Redis 配方开始,并逐步提高实现的复杂性。

什么是限速?

限速是指调节特定客户端对网络服务的请求数量的技术。它限制了请求的总数和/或频率。

为什么需要限速?

您可能希望将限速器添加到 API 中有很多原因,无论是为了防止故意或意外的 API 滥用,限速器都可以阻止入侵者。让我们考虑一些限速器可以拯救您的情况

  • 如果您曾在基于 API 的初创公司工作过,您就会知道要取得成功,您需要一个“免费”层级。免费层级将使潜在客户尝试您的服务并传播口碑。但如果不限制免费层级用户,您可能会冒失去初创公司拥有的少数付费客户的风险。

  • 与您的 API 的编程集成可能存在错误。有时资源匮乏不是由恶意攻击引起的。这些 FFDoS(友军火力拒绝服务)攻击发生的频率比您想象的要高。

  • 最后,每天都有恶意玩家招募机器人来让 API 提供商的生活变得悲惨。能够在这些攻击影响您的用户之前检测和限制这些攻击,可能意味着我们业务的生命。

限速通常在服务器端实现,但如果您控制客户端,您也可以在该点预先阻止某些类型的访问。它依赖于三个特定信息

  1. 谁在发出请求: 识别攻击或滥用的来源是方程式中最重要的部分。如果无法将攻击性请求分组并与单个实体相关联,您将在黑暗中战斗。

  2. 请求的成本是多少: 并非所有请求都是一样的,例如,绑定到单个帐户数据的请求,可能只会造成局部破坏,而跨越多个帐户和/或时间跨度广泛(如多年)的请求则要昂贵得多

  3. 他们的分配配额是多少: 用户允许多少总请求和/或请求的速率。例如,在“免费层级”的情况下,您可能有一个更小的分配/请求桶,他们可以进行,或者您可能会在某些高峰时段减少它们。

为什么 Redis 用于限速?

Redis 由于几个原因特别适合作为实现限速的平台

  • 速度: 限速实现所需的检查和计算将增加 API 的总请求-响应时间,您希望这些操作尽快发生。

  • 集中化和分布式: Redis 可以将您的单服务器/实例设置无缝扩展到数百个节点,而不会牺牲性能或可靠性。

  • 正确的抽象: Redis 提供优化的数据结构来支持几种最常见的限速器实现,并且使用其内置的 TTL(生存时间控制),它允许高效地管理内存。计数是 Redis 的内置功能,也是 Redis 在竞争中脱颖而出的众多领域之一。

现在,让我们从第一个实现开始;简单 “固定窗口”实现.