quota-by-key 策略允许根据密钥强制实施可续订或有生存期的调用量和/或带宽配额。 密钥的值可以是任意字符串,通常使用策略表达式来提供密钥。 可以添加可选增量条件,指定应在配额范围内的请求。 如果多个策略增加相同的键值,则每个请求的键值仅增加一次。 超过调用速率时,调用方会收到 403 Forbidden 响应状态代码。

问题描述

API Management 访问限制策略:quota-by-key ,该策略有个属性renewal-period,它的单位为秒,在实验中多次设置此值,解析出来的结果都与设置的时间不匹配。

APIM 策略设置如下(如 renewal-period="3000"  设置为50分钟):

# policy 定义
<inbound>
<base />
<quota-by-key calls="1" renewal-period="3000" counter-key="@(context.Request.IpAddress)" />
</inbound>

设置完成后,马上在APIM中发送请求进行测试,测试时间Fri, 21 Jan 2022 02:53:16 GMT,但是结果显示 Quota will be replenished in 00:26:44。

理解误区为:

当设置策略的时候,间隔时间命名时50分钟,但为什么测试发现间隔时间不是40多分钟呢? 而是26分钟,所以这个renewal-period参数的规律到底如何来理解呢?

问题分析

在对 quota-by-key 的属性文档进行查找发现,renewal-period 表示在重置配额之前等待的时间长度,以秒为单位。所以 renewal-period 配置的是quota reset的间隔时间,而不是从当前时间(如策略修改的时间)开始递减的计时器。当设置为 0 时,时间段设置为无限。

举例如,假设当前时间为00:11:36,设置了renewal-period为10分钟(600),那么以00:00:00起始,各个10分钟的间隔(00:10, 00:20 ... 11:50, 12:00, 12:10 ...) 时, quota都会重置。

因此,00:41:36s时触发的Quota Exceed,返回的retry-after是8分钟24秒(504秒)

HTTP/1.1 403 Quota Exceeded
content-length: 100
content-type: application/json
date: Thu, 20 Feb 2022 00:41:36 GMT retry-after: 504
vary: Origin
{
"statusCode": 403,
"message": "Out of call volume quota. Quota will be replenished in 00:08:24."
}

此外,如果对于周期非常长的renewal-period,还支持一种周期式的格式(P*Y*M*DT*H*M*S),如P0Y4M0DT0H0M0S:表示0年4个月0天,0小时0分0秒的时间段。

示例为:

    <inbound>
<base />
<quota-by-key calls="1" renewal-period="P0Y4M0DT0H0M0S" counter-key="@(context.Request.IpAddress)" />
</inbound> ####该策略以4个月间隔进行重置。计算间隔的起始日期是1月1日,因此会在每年的4月底,8月底,12月底进行重置。

参考资料

API 管理访问限制策略:https://docs.azure.cn/zh-cn/api-management/api-management-access-restriction-policies#LimitCallRateByKey

【Azure API 管理】API Management 访问限制策略[quota-by-key] 中参数 [renewal-period] 的实验和理解的更多相关文章

  1. 【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token

    问题描述 在APIM中配置对传入的Token进行预验证,确保传入后端被保护的API的Authorization信息正确有效,可以使用validate-jwt策略.validate-jwt 策略强制要求 ...

  2. 【Azure API 管理】从微信小程序访问APIM出现200的空响应的问题中发现CORS的属性[terminate-unmatched-request]功能

    问题描述 使用微信小程序调用APIM(API Management)中的接口,发现POST和PUT请求被拦截,返回的状态码为200,但是无消息内容. 在小程序中的调用JS代码如: 通过浏览器测试得到的 ...

  3. 【Azure API 管理】在APIM 中添加 log-to-eventhub 策略,把 Request Body 信息全部记录在Event Hub中

    问题描述 根据文档 https://docs.azure.cn/zh-cn/api-management/api-management-howto-log-event-hubs, 可以将Azure A ...

  4. 【Azure API 管理】API Management如何有效且快速更新呢?如对APIs/Policy等设置内容

    问题描述 APIM中的内容(API, Policy)等内容,如果有需要更新时候,通常可以在Azure APIM门户上操作,通过一个接口一个设置的修改,也可以针对一个接口导入/导出的方式修改.当APIM ...

  5. 【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

    问题描述 使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制,如被限制的IP地址一分钟可以访问10次,而不被限制的IP地址则可以无限访问? ChatGPT 解答 ...

  6. 如何通过Azure Service Management REST API管理Azure服务

    通过本文你将了解: 什么是Azure Service Management REST API 如何获取微软Azure 订阅号 如何获取Azure管理证书 如何调用Azure Service Manag ...

  7. 【Azure API 管理】解决API Management添加AAD Group时遇见的 Failed to query Azure Active Directory graph due to error 错误

    问题描述 为APIM添加AAD Group时候,等待很长很长的时间,结果添加失败.错误消息为: Write Groups ValidationError :Failed to query Azure ...

  8. 【Azure API 管理】APIM集成内网虚拟网络后,启用自定义路由管理外出流量经过防火墙(Firewall),遇见APIs加载不出来问题

    问题描述 使用 Azure 虚拟网络,Azure APIM 可以管理无法通过 Internet 访问的 API,达到以保护企业内部的后端API的目的.在虚拟网络中,启用网络安全组(NSG:Networ ...

  9. 【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败

    问题描述 使用微软API管理服务(Azure API Management),简称APIM. 因为公司策略要求只能内部网络访问,所以启用了VNET集成.集成方式见: (在内部模式下使用 Azure A ...

  10. 【Azure API 管理】在APIM中使用客户端证书验证API的请求,但是一直提示错误"No client certificate received."

    API 管理 (APIM) 是一种为现有后端服务创建一致且现代化的 API 网关的方法. 问题描述 在设置了APIM客户端证书,用户保护后端API,让请求更安全. 但是,最近发现使用客户端证书的API ...

随机推荐

  1. SQL注入payload学习整理

    SQLserver 用的payload 0101%'and 1=(select @@version) and '%'=' GS的一个客户端参数 <add PropertyName="F ...

  2. AI五子棋 C++ 借助图形库raylib和raygui 设计模式思考过程和实现思路总结

    转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/17988499 repo: https://github.com/Satar07/AI_GoBang_Pub ...

  3. element-ui中Select 选择器去除点击时的淡蓝色边框

    <el-select class="my-el-select" v-model="tenantCont" placeholder="请输入机构标 ...

  4. Rocketmq学习4——Broker消息持久化原理源码浅析

    一丶前言 在<Rocketmq学习3--消息发送原理源码浅析>中,我们学习了消息发送的要点: 本地缓存+rpc 请求namesever + 定时刷新,topic路由信息 负载均衡的选择一个 ...

  5. C# 中判断List集合是否为空

    判断List集合是否为空,可以使用Count和Any,下面是其使用场景(别人总结)

  6. SpringBoot实现动态数据源配置

    场景描述: 前一阵子接手的新项目中需要使用2个数据源. 一个叫行云数据库,一个叫OceanBase数据库. 就是说,我有时候查询要查行云的数据,有时候查询要查 OceanBase 的数据,咋办? 废话 ...

  7. uni-app 介绍及使用

    一.什么是uni-app uni-app由dcloud公司开发的多端融合框架,是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以 ...

  8. 什么是IO?IO的本质?|如何让IO变得高效?何为高效?|异步IO|多路转接|reactor模式

     前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量干货博客汇总https://blog ...

  9. 【AI视频教程】只需5步,AI作出鸡你太美视频

    1.视频效果 黄昏见证虔诚的信徒 2.准备工作 制作视频效果,需要准备下面3个条件: 准备stable diffusion的环境 剪辑一段[鸡你太美]原版视频 stable diffusion安装sd ...

  10. Linux 中通过虚拟地址获取物理地址并锁定

    在 Linux 开发过程中,申请内存后,某些时候需要用物理地址传给其他外设进行写入或者读取操作,同时考虑到防止被操作系统 sawp,导致实际的物理地址发生变化,从而在操作对应的虚拟地址时无法正常运行等 ...