你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍了 Azure 资源管理器如何限制请求。 介绍了如何在达到限制之前跟踪剩余的请求数,以及在达到限制时如何应对。
区域限制和令牌桶算法
自 2024 年起,Microsoft 已将 Azure 订阅迁移到更新的流量控制架构。 现在,限制将按区域,而不是按 Azure 资源管理器的实例应用。 此新体系结构使用 令牌存储桶算法 来管理 API 限制。
令牌存储桶表示每秒可以发送的最大请求数。 达到最大请求数后,重新填充速率决定了令牌在存储桶中变为可用状态的速度。
通过这些更新后的限制,可以更轻松地刷新和管理配额。
更新的限制如下:
范围 | 操作次数 | 存储桶大小 | 每秒重新填充速率 |
---|---|---|---|
订阅 | 读取 | 250 | 二十五 |
订阅 | 删除次数 | 200 | 10 |
订阅 | 写入次数 | 200 | 10 |
租户 | 读取 | 250 | 二十五 |
租户 | 删除次数 | 200 | 10 |
租户 | 写入次数 | 200 | 10 |
订阅限制将按订阅、服务主体和操作类型应用。 对于每个运营类型,还存在相当于单个服务主体限制 15 倍的全局订阅限制。 全局限制应用于所有服务主体。 如果超出全局、服务主体或租户特定限制,则会限制请求。
免费或试用版客户的限制可能较小。
例如,假设你的存储桶大小为 250 个读取请求令牌,而重新填充速率为每秒 25 个令牌。 如果每秒发送 250 个读取请求,则存储桶将会清空,并且会限制请求。 在存储桶达到其最大容量 250 个令牌之前,每秒将有 25 个令牌可用。 可以在令牌可用时使用令牌。
使用 */providers/microsoft.insights/metrics
API 读取指标对 Azure 资源管理器整体流量的影响很大,是订阅限制事件的常见原因。 如果大量使用此 API,建议切换到 getBatch
API。 可以在单个 REST 请求中查询多个资源,从而提高性能并减少限制。 有关转换操作的详细信息,请参阅如何从指标 API 迁移到 getBatch API。
如何查看受限制的请求?
若要查看受限制的请求和其他资源管理器指标,请参阅 访问 Azure 资源管理器指标。
为什么按区域而不是按实例应用限制?
由于不同区域具有不同的资源管理器实例数,因此按实例限制会导致限制性能不一致。 按区域限制可保持限制处于一致状态且可以预测。
更新后的限制体验会如何影响我的限制?
可以发送更多请求。 写入请求增加 30 倍。 删除请求增加 2.4 倍。 读取请求增加 7.5 倍。
后台作业限制
Azure 资源管理器(ARM)中的后台作业是在后台运行的自动化任务,用于支持资源部署、诊断和系统维护等作。 这些作业对于处理用户请求并确保服务功能至关重要。 为了保持平台稳定性和可靠性,ARM 采用后台作业限制来管理这些任务的负载。
如果你收到以下错误消息,则可以确定后台作业限制何时发生:
The request for subscription '{0}' could not be processed due to an excessive volume of traffic. Please try again later.
客户可能会因为过多的后台作业而遇到限制,这可能是由高频操作或系统范围的活动触发的。 虽然客户无法直接控制这些作业的创建或执行,但认识潜在限制非常重要。
对非公有云的限制
限制在两个级别发生。 Azure 资源管理器限制对订阅和租户的请求。 如果请求低于订阅和租户的限制,资源管理器会将该请求路由到资源提供程序。 资源提供程序可应用专为其操作定制的限制。
最初会在发送请求的用户所在的区域中按主体 ID 和 Azure 资源管理器实例对请求进行限制。 区域中对 Azure 资源管理器实例的请求也会根据主体用户 ID 和每小时限制。 将请求转发到资源提供程序时,将按资源区域(而不是按用户区域中的 Azure 资源管理器实例)对请求进行限制。
注释
资源提供程序的限制可能与用户区域中 Azure 资源管理器实例的限制不同。
下图显示了在请求从用户转到 Azure 资源管理器和资源提供程序时如何应用限制。
订阅和租户限制
每个订阅级别和租户级别的操作都会受到限制。 订阅请求是需要传递订阅 ID 的请求,例如在订阅中检索资源组。 例如,向 https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups?api-version=2022-01-01
发送请求是订阅级操作。 租户请求(例如,检索有效的 Azure 位置)不包括订阅 ID。 例如,向 https://management.azure.com/tenants?api-version=2022-01-01
中发送请求则是租户级操作。
下表显示了每小时的默认限制。
范围 | 操作次数 | 限制 |
---|---|---|
订阅 | 读取 | 12,000 |
订阅 | 删除次数 | 15,000 |
订阅 | 写入次数 | 1,200 |
租户 | 读取 | 12,000 |
租户 | 写入次数 | 1,200 |
这些限制的范围局限于发出请求的安全主体(用户或应用程序)以及订阅 ID 或租户 ID。 如果请求来自多个安全主体,则对订阅或租户的限制高于每小时 12,000 个和 1,200 个。
这些限制应用于每个 Azure 资源管理器实例。 每个 Azure 区域中有多个实例,Azure 资源管理器将部署到所有 Azure 区域。 因此,实践中的限制要高于这些限制。 用户的请求通常由不同的 Azure 资源管理器实例处理。
其余请求在响应头值中返回。
资源提供程序限制
资源提供程序可应用其自身的限制。 在每个订阅中,资源提供程序会限制请求中资源的每个区域。 由于资源管理器受资源管理器实例的限制,并且每个区域中有多个资源管理器实例,因此资源提供程序收到的请求数可能会超过上一部分的默认限制。
本部分讨论了一些广泛使用的资源提供程序的限制。
存储限制
仅当将 Azure 资源管理器与 Azure 存储和存储资源提供程序配合使用来执行管理操作时,以下限制才适用。 该限制适用于请求中资源的每个订阅的每个区域。
资源 | 限制 |
---|---|
存储帐户管理操作数(读取) | 每 5 分钟 800 次 |
存储帐户管理操作次数(写入) | 每秒 10 次/每小时 1200 次 |
存储帐户管理操作次数(列出) | 每 5 分钟 100 次 |
网络限制
Microsoft.Network 资源提供程序应用以下限制:
操作 | 限制 |
---|---|
写入/删除 (PUT) | 每 5 分钟 1,000 次 |
读取 (GET) | 每 5 分钟 10,000 次 |
除了这些常规限制之外,请参阅 Azure DNS 的使用限制。
计算限制
Microsoft 计算将实施限制,以便为虚拟机和虚拟机规模集用户提供最佳体验。 计算限制提供有关 VM、虚拟机规模集和规模集 VM 的限制策略和限制的全面信息。
Azure Resource Graph 限制
Azure Resource Graph 会限制对其操作发出的请求数。 本文所述的用于确定剩余请求数以及在达到限制时如何采取应对措施的步骤同样适用于 Resource Graph。 但是,Resource Graph 设置了自身的限制和重置速率。 有关详细信息,请参阅 Resource Graph 限制标头。
Azure Resource Graph 还提供了一种解决方案,通过与现有的 Azure 资源管理器控制平面 GET 和 LIST API 无缝集成,实现一个额外机制在达到资源提供程序限制时获取资源数据,从而为资源数据访问提供强大的可缩放解决方案。 有关详细信息,请参阅 ARG GET/LIST API。
其他资源提供程序
有关其他资源提供程序中的限制的信息,请参阅:
错误代码
达到限制时,会收到 HTTP 状态代码“429 请求过多”。 响应包含 Retry-After 值,该值指定在发送下一个请求之前应用程序应该等待的秒数。 如果在重试值用尽之前发送请求,将不会处理该请求,并会返回一个新的重试值。
如果你使用的是 Azure SDK,该 SDK 可能会采用自动重试配置。 有关详细信息,请参阅 Azure 服务的重试指南。
某些资源提供程序返回 429 来报告暂时性问题。 该问题可能是一种过载状态,不是请求造成的。 或者,它可能是一种有关目标资源或从属资源的状态的暂时性错误。 例如,当其他操作锁定了目标资源时,网络资源提供程序将返回 429,并显示 RetryableErrorDueToAnotherOperation 错误代码。 若要确定错误是由限制还是暂时性的状况造成,请查看响应中的错误详细信息。
剩余的请求数
可以通过检查响应标头来确定剩余的请求数。 读取请求在标头中返回一个值,表示剩余读取请求的数目。 写入请求包含的值表示剩余写入请求的数目。 下表描述了可在其中检查这些值的标头:
响应标头 | 说明 |
---|---|
x-ms-ratelimit-remaining-subscription-deletes | 划归到订阅的剩余删除数。 执行删除操作时返回此值。 |
x-ms-ratelimit-remaining-subscription-reads | 划归到订阅的剩余读取次数。 执行读取操作时返回此值。 |
x-ms-ratelimit-remaining-subscription-writes | 划归到订阅的剩余写入次数。 执行写入操作时返回此值。 |
x-ms-ratelimit-remaining-tenant-reads | 剩余的租户范围读取数 |
x-ms-ratelimit-remaining-tenant-writes | 剩余的租户范围写入数。 |
x-ms-ratelimit-remaining-subscription-resource-requests | 剩余的订阅范围资源类型请求数。 仅当服务替代了默认限制时,才返回此标头值。 Resource Manager 将累加此值而不是订阅读取/写入数。 |
x-ms-ratelimit-remaining-subscription-resource-entities-read | 剩余的订阅范围资源类型集合请求数。 仅当服务替代了默认限制时,才返回此标头值。 此值提供剩余集合请求数(列出资源)。 |
x-ms-ratelimit-remaining-tenant-resource-requests | 剩余的租户范围资源类型请求数。 仅当服务替代了默认限制时,才在租户级别为请求添加此标头。 Resource Manager 将累加此值而不是租户读取/写入数。 |
x-ms-ratelimit-remaining-tenant-resource-entities-read | 划归到租户的剩余资源类型集合请求数。 仅在租户级别,且仅当服务替代了默认限制时,为请求添加此标头。 |
资源提供程序还可以返回包含剩余请求数相关信息的响应标头。 有关“计算”资源提供程序返回的响应标头的信息,请参阅调用速率参考性响应标头。
检索标头值
检索代码或脚本中的这些标头值与检索任何标头值没有什么不同。
例如,在 C# 中,可使用以下代码从名为 response 的 HttpWebResponse 对象中检索标头值:
response.Headers.GetValues("x-ms-ratelimit-remaining-subscription-reads").GetValue(0)
在 PowerShell 中,从 Invoke-WebRequest
操作中检索标头值。
$r = Invoke-WebRequest -Uri https://management.azure.com/subscriptions/{guid}/resourcegroups?api-version=2016-09-01 -Method GET -Headers $authHeaders
$r.Headers["x-ms-ratelimit-remaining-subscription-reads"]
如果需要完整的 PowerShell 示例,请参阅检查给定订阅的 ARM 限制。
若要查看剩余的调试请求数,请在 PowerShell cmdlet 中提供 -Debug 参数。
Get-AzResourceGroup -Debug
响应包含许多值,包括以下响应值:
DEBUG: ============================ HTTP RESPONSE ============================
Status Code:
OK
Headers:
Pragma : no-cache
x-ms-ratelimit-remaining-subscription-reads: 11999
若要获取写入限制,请使用写入操作:
New-AzResourceGroup -Name myresourcegroup -Location westus -Debug
响应包含许多值,包括以下值:
DEBUG: ============================ HTTP RESPONSE ============================
Status Code:
Created
Headers:
Pragma : no-cache
x-ms-ratelimit-remaining-subscription-writes: 1199
在 Azure CLI 中,使用更详细的选项来检索标头值:
az group list --verbose --debug
该命令会返回许多值,包括以下值:
msrest.http_logger : Response status: 200
msrest.http_logger : Response headers:
msrest.http_logger : 'Cache-Control': 'no-cache'
msrest.http_logger : 'Pragma': 'no-cache'
msrest.http_logger : 'Content-Type': 'application/json; charset=utf-8'
msrest.http_logger : 'Content-Encoding': 'gzip'
msrest.http_logger : 'Expires': '-1'
msrest.http_logger : 'Vary': 'Accept-Encoding'
msrest.http_logger : 'x-ms-ratelimit-remaining-subscription-reads': '11998'
若要获取写入限制,请使用写入操作:
az group create -n myresourcegroup --location westus --verbose --debug
该操作会返回许多值,包括以下值:
msrest.http_logger : Response status: 201
msrest.http_logger : Response headers:
msrest.http_logger : 'Cache-Control': 'no-cache'
msrest.http_logger : 'Pragma': 'no-cache'
msrest.http_logger : 'Content-Length': '163'
msrest.http_logger : 'Content-Type': 'application/json; charset=utf-8'
msrest.http_logger : 'Expires': '-1'
msrest.http_logger : 'x-ms-ratelimit-remaining-subscription-writes': '1199'
后续步骤
- 有关限制和配额的详细信息,请参阅 Azure 订阅和服务限制、配额和约束。
- 若要了解如何处理异步 REST 请求,请参阅跟踪异步 Azure 操作。