APIM 组合节流策略方法

问题描述 投票:0回答:3

目前在 APIM 中,我们有产品订阅密钥级别限制。但显然,如果我们在同一产品中有多个 API,则一个 API 可能会消耗更多配额 超出预期并阻止其他人使用该应用程序。因此,根据 MS 文档 (https://learn.microsoft.com/en-us/azure/api-management/api-management-sample-flexible-throtdling),我们可以使用组合策略。

问题是我们是否可以使用这种方法,

    API-1 300 calls per 60 seconds where product subscription key =123
    API-2 200 calls per 60 seconds where product subscription key =123
    API-3 200 calls per 60 seconds where product subscription key =123

如果是这样,产品订阅密钥的调用总数可能是多少?如果有道理的话。

我采取了以下方法来组合政策。但不喜欢。

    <rate-limit-by-key calls="50" renewal-period="60" counter-key="@(&quot;somevalue&quot; + context.Request.Headers.GetValueOrDefault(&quot;Ocp-Apim-Subscription-Key&quot;))" />
    <rate-limit calls="10" renewal-period="30">  
        <api name="AddressSearch API dev" calls="5" renewal-period="30" />  
            <operation name="Search_GetAddressSuggestions" calls="3" renewal-period="30" />
    </rate-limit>
azure-api-management ibm-api-management
3个回答
1
投票

了解按密钥速率限制和速率限制的计数器是独立的非常重要。

当按密钥速率限制允许请求通过时,它会增加计数器。当速率限制允许请求通过时,它会增加其计数器s。在您的配置中,当按键速率限制限制请求时,速率限制将不会被执行,并且不会计算请求。

这意味着在大多数情况下,下限获胜。您的配置将允许一个订阅每分钟进行 50 次调用,但这不太可能产生任何影响,因为第二个速率限制策略将在对同一产品进行 10 次调用后进行限制,因此第一个订阅将没有任何机会执行任何操作。

如果您想要示例中的限制,您可以使用如下配置:

<rate-limit calls="0" renewal-period="0">  
    <api name="API-1" calls="100" renewal-period="60" />  
    <api name="API-2" calls="200" renewal-period="60" />  
    <api name="API-3" calls="300" renewal-period="60" />  
</rate-limit>

1
投票

因此,为了具有速率限制 API 级别,我提出了下面的方案来满足我的要求。

<choose>
  <when condition="@(context.Operation.Id.Equals("End point name1"))">
    <rate-limit-by-key calls="40" renewal-period="30" counter-key="@(context.Api.Name + context.Operation.Name + context.Request.Headers.GetValueOrDefault("Ocp-Apim-Subscription-Key"))" />
  </when>
  <when condition="@(context.Operation.Id.Equals("End point name2"))">
    <rate-limit-by-key calls="20" renewal-period="30" counter-key="@(context.Api.Name + context.Operation.Name + context.Request.Headers.GetValueOrDefault("Ocp-Apim-Subscription-Key"))" />
  </when>
  <otherwise>
    <rate-limit-by-key calls="15" renewal-period="30" counter-key="@(context.Api.Name + context.Operation.Name + context.Request.Headers.GetValueOrDefault("Ocp-Apim-Subscription-Key"))" />
  </otherwise>
</choose>

希望这有帮助。


0
投票

只是为了确认 - 您正在根据订阅密钥在 API 级别设置三个限制策略:

API-1: 300 calls per 60 seconds
 API-2: 200 calls per 60 seconds
 API-3: 200 calls per 60 seconds

在这种情况下,如果这些是您唯一的 API,则每个订阅密钥每 60 秒的最大请求数为: 300 + 200 + 200 = 700.

如果您有更多 API,它们将不会受到限制,除非您也为它们指定策略。

© www.soinside.com 2019 - 2024. All rights reserved.