APIM结合节流策略方法

时间:2018-12-09 07:28:32

标签: azure-api-management api-management

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

问题在于这种方法是否可以如下使用

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>

3 个答案:

答案 0 :(得分:1)

重要的是要了解key-limit-key-key和rate-limit的计数器是独立的。

当密钥限制速率允许请求通过时,它的计数器增加。当速率限制允许请求通过时,它的计数器增加 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 :(得分: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,除非您也为其指定了策略,否则它们不会受到限制。

答案 2 :(得分:0)

因此,为了获得限速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>

希望这会有所帮助。