限制 Resource Manager 请求数

对于每个订阅和租户,Resource Manager 将读取请求数限制为 15,000/小时,将写入请求数限制为 1,200/小时。 这些限制适用于每个 Azure 资源管理器实例。 每个 Azure 区域中有多个实例,Azure 资源管理器将部署到所有 Azure 区域。 因此,在实践中,限制实际上比上述限制要高得多,因为用户请求通常是由多个不同的实例提供服务。

如果应用程序或脚本达到了这些限制,则需对请求数进行限制。 本文说明如何在达到限制之前确定剩余的请求数,以及达到限制时如何做出响应。

达到限制时,会收到 HTTP 状态代码“429 请求过多”。

请求数仅限于订阅或租户。 如果订阅中有多个并发应用程序在进行请求,则会将这些应用程序发出的请求加在一起来确定剩余请求数。

划归到订阅的请求涉及到传递订阅 ID,例如,检索订阅中的资源组。 划归到租户的请求不包括订阅 ID,例如,检索有效的 Azure 位置。

剩余请求数

可以通过检查响应标头确定剩余请求数。 每个请求都包含剩余读取和写入请求数的值。 下表说明了各种响应标头,用户可以检查其中是否存在这些值:

响应标头 说明
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# 中,可使用以下代码从名为 responseHttpWebResponse 对象中检索标头值:

response.Headers.GetValues("x-ms-ratelimit-remaining-subscription-reads").GetValue(0)

PowerShell中,可以通过 Invoke-WebRequest 操作检索标头值。

$r = Invoke-WebRequest -Uri https://management.chinacloudapi.cn/subscriptions/{guid}/resourcegroups?api-version=2016-09-01 -Method GET -Headers $authHeaders
$r.Headers["x-ms-ratelimit-remaining-subscription-reads"]

或者,如果想要查看剩余请求数以进行调试,可以在 PowerShell cmdlet 中提供 -Debug 参数。

Get-AzureRmResourceGroup -Debug

这会返回许多值,包括以下响应值:

DEBUG: ============================ HTTP RESPONSE ============================

Status Code:
OK

Headers:
Pragma                        : no-cache
x-ms-ratelimit-remaining-subscription-reads: 14999

若要获取写入限制,请使用写入操作:

New-AzureRmResourceGroup -Name myresourcegroup -Location chinanorth -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': '14998'

若要获取写入限制,请使用写入操作:

az group create -n myresourcegroup --location chinanorth --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'

在发送下一请求之前等待

达到请求限制时,Resource Manager 会在标头中返回 429 HTTP 状态代码和 Retry-After 值。 Retry-After 值指定在发送下一个请求之前应用程序应该等待(或休眠)的秒数。 如果在尚未达到重试时间值的情况下发送请求,该请求不会得到处理,并会返回一个新的重试时间值。

后续步骤