0

目前在 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>
4

3 回答 3

1

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

当 rate-limit-by-key 允许请求通过时,它会增加它的计数器。当速率限制允许请求通过时,它的计数器s会增加。在您的配置中,当 rate-limit-by-key 限制请求时,rate-limit 将不会被执行并且不会计算请求。

这意味着在大多数情况下,下限获胜。您的配置将允许一个订阅每分钟进行 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>
于 2018-12-11T19:26:03.953 回答
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>

希望这可以帮助。

于 2018-12-19T00:37:49.460 回答
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,除非您也为它们指定策略,否则它们不会受到限制。

于 2018-12-10T17:47:54.330 回答