按订阅限制调用速率

适用于:所有 API 管理层级

rate-limit 策略可以对调用速率进行限制,使每个指定时段的调用不超出指定的数目,避免单个订阅的 API 使用量暴增。 超过调用速率时,调用方会收到 429 Too Many Requests 响应状态代码。

若要了解速率限制和配额之间的差异,请参阅速率限制和配额

注意

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

注意

按照策略声明中提供的顺序设置策略的元素和子元素。 详细了解如何设置或编辑 API 管理策略

策略语句

<rate-limit calls="number" renewal-period="seconds"  retry-after-header-name="custom header name, replaces default 'Retry-After'" 
        retry-after-variable-name="policy expression variable name"
        remaining-calls-header-name="header name"  
        remaining-calls-variable-name="policy expression variable name"
        total-calls-header-name="header name">
    <api name="API name" id="API id" calls="number" renewal-period="seconds" >
        <operation name="operation name" id="operation id" calls="number" renewal-period="seconds" />
    </api>
</rate-limit>

属性

属性 说明 需要 默认
calls renewal-period 所指定的时间间隔内允许的最大总调用数。 不允许使用策略表达式。 不适用
renewal-period 滑动窗口的长度(以秒为单位),在此期间,允许的请求数不应超过 calls 中指定的值。 允许的最大值:300 秒。 不允许使用策略表达式。 空值
retry-after-header-name 自定义响应头的名称,其值为在超过指定的调用速率后建议的重试间隔(以秒为单位)。 不允许使用策略表达式。 Retry-After
retry-after-variable-name 变量的名称,该变量用于存储在超过指定的调用速率后建议的重试间隔(以秒为单位)。 不允许使用策略表达式。 空值
remaining-calls-header-name 响应头的名称,每次执行策略后,其值为在 renewal-period 中指定的时间间隔内允许的剩余调用数。 不允许使用策略表达式。 空值
remaining-calls-variable-name 变量的名称,该变量用于存储在每次执行策略后,renewal-period 中指定的时间间隔内允许的剩余调用数。 不允许使用策略表达式。 空值
total-calls-header-name 响应头的名称,其值为 calls 中指定的值。 不允许使用策略表达式。 空值

元素

元素 说明 必需
api 添加一个或多个此类元素,对产品中的 API 施加调用速率限制。 产品和 API 的调用速率限制是分别应用的。 可以通过 nameid 引用 API。 如果同时提供了这两个属性,则将使用 id 并忽略 name
operation 添加一个或多个此类元素,对 API 中的操作施加调用速率限制。 产品、API 和操作的调用速率限制是分别应用的。 可以通过 nameid 引用 Operation。 如果同时提供了这两个属性,则将使用 id 并忽略 name

api 属性

属性 说明 需要 默认
name 要对其应用速率限制的 API 的名称。 必须指定 nameid 不适用
id 要对其应用速率限制的 API 的 ID。 必须指定 nameid 不适用
calls renewal-period 所指定的时间间隔内允许的最大总调用数。 不允许使用策略表达式。 不适用
renewal-period 滑动窗口的长度(以秒为单位),在此期间,允许的请求数不应超过 calls 中指定的值。 允许的最大值:300 秒。 不允许使用策略表达式。 空值

操作属性

属性 说明 需要 默认
name 要对其应用速率限制的操作的名称。 必须指定 nameid 不适用
id 要对其应用速率限制的操作的 ID。 必须指定 nameid 不适用
calls renewal-period 所指定的时间间隔内允许的最大总调用数。 不允许使用策略表达式。 不适用
renewal-period 滑动窗口的长度(以秒为单位),在此期间,允许的请求数不应超过 calls 中指定的值。 允许的最大值:300 秒。 不允许使用策略表达式。 空值

使用情况

使用注意事项

  • 每个策略定义只能使用此策略一次。
  • 此策略仅在使用订阅密钥来访问 API 时应用。
  • 可以将自承载网关中的速率限制计数配置为在本地同步(在群集节点中的网关实例之间),例如,通过 Kubernetes 的 Helm 图表部署或使用 Azure 门户部署模板。 但是,速率限制计数不会与 API 管理实例中配置的其他网关资源同步,包括云中的托管网关。 了解详细信息

示例

在下面的示例中,每个订阅的速率限制为每 90 秒 20 个调用。 每次执行策略后,在该时间段内允许的剩余调用存储在变量 remainingCallsPerSubscription 中。

<policies>
    <inbound>
        <base />
        <rate-limit calls="20" renewal-period="90" remaining-calls-variable-name="remainingCallsPerSubscription"/>
    </inbound>
    <outbound>
        <base />
    </outbound>
</policies>

后续步骤

有关使用策略的详细信息,请参阅: