你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于:所有 API 管理层级
限制传入请求的能力是 Azure API 管理的关键角色。 API 管理使 API 提供程序能够通过控制请求速率或传输的请求总数/数据来保护其 API 免受滥用,并为不同的 API 产品层创造价值。 本文介绍如何创建和应用配额和速率限制。
速率限制和配额
速率限制和配额用于不同目的。
速率限制
速率限制通常用于防止短时间内密集的流量突发。 例如,如果知道后端服务在通话量较高时其数据库存在瓶颈,则可以设置一个 rate-limit-by-key
策略来禁止高通话量。
谨慎
由于分布式限流架构的特性,速率限制永远不会精确。 所配置的请求数与实际数量之间的差异因请求量和速率、后端延迟和其他因素而异。
配额
配额通常用于在较长一段时间内控制呼叫率。 例如,可以设置特定订阅者在给定月份内能够发出的调用总数。 如果通过 API 盈利,还可以为基于层的订阅以不同的方式设置配额。 例如,基本层订阅每月的呼叫数可能不超过 10,000 次,但高级层每月可以进行 100,000,000 次呼叫。
在 API 管理中,速率限制通常在节点之间传播得更快,以防止峰值。 相比之下,使用配额信息会长期使用,因此其实现有所不同。
注释
在服务平台中重启基础计算资源时,API 管理可能会在达到配额后继续处理短时间内的请求。
基于产品的限流
API 提供程序可以使用范围限定为特定订阅的速率限制功能,以对注册使用其 API 的开发人员应用限制。 但是,举例来说,这种类型的限制对于限制 API 的单个最终用户并没有帮助。 想让开发人员的应用程序的单个用户使用整个配额,并让开发人员的其他客户无法使用应用程序,是有可能的。 此外,生成大量请求的多个客户可能会限制对偶尔用户的访问权限。
基于密钥的自定义限流
注释
在 Azure API 管理的消耗层中,策略 rate-limit-by-key
和 quota-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 地址,这可能是限制用户使用的有效方法。 但是,可能有多个用户共享单个公共 IP 地址,因为它们通过 NAT 设备访问 Internet。 不过,对于允许未经身份验证的访问的 API,使用 IpAddress
可能是最佳选择。
用户标识限制
如果最终用户已经过身份验证,则可以基于唯一标识用户的信息生成限制密钥:
<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-limit
,rate-limit-by-key
azure-openai-token-limit
)在 llm-token-limit
API 管理网关级别使用计数器。 因此,在 API 管理 的多区域部署 中,每个区域网关都有单独的计数器,并且为每个区域单独强制实施速率限制。 同样,在具有 工作区的 API 管理实例中,为每个工作区网关单独强制实施限制。
配额策略(例如 quota
和 quota-by-key
全局策略),这意味着在 API 管理实例级别使用单个计数器。
概要
API 管理提供速率和配额限制,以保护 API 服务并增加价值。 使用自定义范围规则的限制策略可以更精细地控制这些策略,使客户能够生成更好的应用程序。 本文中的示例演示如何使用这些策略,方法是使用客户端 IP 地址、用户标识和客户端生成的值创建速率限制密钥。 但是,可以使用消息的其他许多部分,例如用户代理、URL 路径片段和消息大小。