Leer en inglés

Compartir a través de

使用 Azure API 管理进行高级请求限制

适用于:所有 API 管理层级

能够限制传入请求是 Azure API 管理的关键角色。 通过控制请求速率或传输的总请求/数据,API 管理允许 API 提供程序保护其 API 免受滥用,并为不同的 API 产品层创造价值。

速率限制和配额

速率限制和配额用于不同目的。

速率限制

速率限制通常用于防止短时间内密集的流量突发。 例如,如果你知道后端服务在其数据库上存在瓶颈,且调用量较高,则可以使用此设置将策略设置为 rate-limit-by-key 不允许高调用量。

Precaución

由于限制体系结构的分布式性质,速率限制永远不可能完全准确。 允许的请求的配置数字和实际数字之间的差异因请求量和速度、后端延迟以及其他因素而异。

配额

配额通常用于控制较长时间的呼叫速率。 例如,可以设置特定订阅者在给定月份内能够发出的调用总数。 为了通过 API 获利,还可以为基于层级的订阅设置不同的配额。 例如,基本层订阅每月最多可以进行 10,000 次调用,而高级层订阅每月最多可以进行 100,000,000 次调用。

在 Azure API 管理中,速率限制通常跨节点传播得更快,以防止峰值。 相比之下,使用配额信息会长期使用,因此其实现不同。

Nota

当服务平台基础计算资源重启时,API Management 可能会在达到配额后的短时间内继续处理请求。

基于产品的限流

范围限定为特定订阅的速率限制功能对于 API 提供程序对注册使用其 API 的开发人员应用限制非常有用。 但是,它无助于限制 API 的各个最终用户。 开发者应用程序的某个用户可能会耗尽全部配额,从而导致其他用户无法使用该应用程序。 此外,可能会生成大量请求的多个客户可能会限制对偶尔用户的访问权限。

基于密钥的自定义限流

Nota

在 Azure API 管理的消耗层中,策略 rate-limit-by-keyquota-by-key 不可用。

按键限速策略按键配额策略提供更灵活的流量控制解决方案。 通过这些策略,可以定义表达式来标识用于跟踪流量使用情况的密钥。 用示例最容易说明此方法的运作方式。

IP 地址限制

以下策略将单个客户端 IP 地址限制为每分钟仅 10 次调用,每月总共 1,000,000 个调用和 10,000 KB 的带宽。

<rate-limit-by-key  calls="10"
          renewal-period="60"
          counter-key="@(context.Request.IpAddress)" />

<quota-by-key calls="1000000"
          bandwidth="10000"
          renewal-period="2629800"
          counter-key="@(context.Request.IpAddress)" />

如果 Internet 上的所有客户端都使用了唯一的 IP 地址,这可能是限制用户使用的有效方法。 但是,由于多个用户通过 NAT 设备访问 Internet,可能有多个用户共享单个公共 IP 地址。 尽管如此,IpAddress 可能是允许未经身份验证访问的 API 的最佳选择。

用户标识限制

如果最终用户经过身份验证,则可以根据唯一标识该用户的信息生成限制密钥。

<rate-limit-by-key calls="10"
    renewal-period="60"
    counter-key="@(context.Request.Headers.GetValueOrDefault("Authorization","").AsJwt()?.Subject)" />

此示例演示如何提取 Authorization 标头,将其 JWT 转换为对象,并使用令牌的主题来标识用户,并将其用作速率限制密钥。 如果用户标识作为其他声明之一存储在 JWT 中,那么可以用该值代替。

组合策略

虽然基于用户的节流策略比基于订阅的节流策略提供更多的控制,但结合这两种功能仍然有其价值。 按产品订阅密钥限制(按订阅限制调用速率 和按 订阅设置使用配额)是一种很好的方法,通过根据使用级别收费实现 API 的盈利。 通过用户限流的更精细控制起到补充作用,并防止一个用户的行为降低另一用户的体验。

客户驱动的流量限制

使用策略表达式定义限流键时,API 提供者负责选择限流的范围。 但是,开发人员可能想要控制他们对自己的客户进行速率限制的方式。 API 提供程序可以通过引入自定义标头来启用此功能,以允许开发人员的客户端应用程序将密钥传达给 API。

<rate-limit-by-key calls="100"
          renewal-period="60"
          counter-key="@(request.Headers.GetValueOrDefault("Rate-Key",""))"/>

这使开发人员的客户端应用程序能够选择要创建速率限制密钥的方式。 客户端开发人员可以通过向用户分配密钥集并轮换密钥使用情况来创建自己的速率层。

多个区域或网关的注意事项

速率限制策略(例如rate-limitrate-limit-by-keyazure-openai-token-limit)在 llm-token-limit API 管理网关级别使用计数器。 这意味着,在 API 管理 的多区域部署 中,每个区域网关都有单独的计数器,并且为每个区域单独强制实施速率限制。

配额策略(例如 quotaquota-by-key 是全局策略),这意味着在 API 管理实例级别使用单个计数器。

概要

Azure API 管理提供速率和配额限制,不但能保护 API 服务,而且能为 API 服务增加价值。 这些具有自定义范围规则的节流策略允许您更精细地控制这些策略,使您的客户能够创建更出色的应用程序。 本文中的示例演示了如何使用客户端 IP 地址、用户身份和客户端生成的值来制造速率限制密钥,从而应用这些新策略。 但是,可以使用消息的其他许多部分,例如用户代理、URL 路径片段和消息大小。