目前在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="@("somevalue" + context.Request.Headers.GetValueOrDefault("Ocp-Apim-Subscription-Key"))" />
<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>
答案 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>
希望这会有所帮助。