排查 API 限制错误

Azure 计算请求可能会在订阅和按区域限制,以帮助提高服务的整体性能。 我们确保对 Azure 计算资源提供程序的所有调用 (CRP) ,后者管理 Microsoft.Compute 命名空间下的资源不会超过允许的最大 API 请求速率。 本文档介绍 API 限制、如何排查限制问题的详细信息,以及避免受限制的最佳做法。

Azure 资源管理器与资源提供程序的限制

Azure 资源管理器会对所有传入的 API 请求执行身份验证和一阶验证和限制。 此处介绍了 Azure 资源管理器调用速率限制和相关诊断响应 HTTP 标头。

当 Azure API 客户端收到限制错误时,HTTP 状态为 429 请求过多。 若要了解请求限制是由 Azure 资源管理器 还是基础资源提供程序(如 CRP)完成的,请检查 x-ms-ratelimit-remaining-subscription-reads GET 请求和x-ms-ratelimit-remaining-subscription-writes非 GET 请求的响应标头。 如果剩余调用计数接近 0,则已达到 Azure 资源管理器定义的订阅常规调用限制。 所有订阅客户端的活动一起计数。 否则,限制来自目标资源提供程序 (请求 URL) 段寻址 /providers/<RP> 的限制。

调用速率信息响应标头

标头 值格式 示例 说明
x-ms-ratelimit-remaining-resource <source RP>/<policy or bucket>;<count> Microsoft.Compute/HighCostGet;159 涵盖资源存储桶或操作组(包括此请求目标)的限制策略的剩余 API 调用计数
x-ms-request-charge <count> 1 此 HTTP 请求的调用计数“收费”到适用策略的限制。 这通常为 1。 批处理请求(例如用于缩放虚拟机规模集)可能会收取多个计数费用。

请注意,API 请求可能受制于多个限制策略。 每个策略都有一个单独的 x-ms-ratelimit-remaining-resource 标头。

下面是删除虚拟机规模集请求的示例响应。

x-ms-ratelimit-remaining-resource: Microsoft.Compute/DeleteVMScaleSet;107 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/DeleteVMScaleSet;587 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/VMScaleSetBatchedVMRequests;3704 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/VmssQueuedVMOperations;4720 

限制错误详细信息

429 HTTP 状态通常用于拒绝请求,因为已达到调用速率限制。 来自计算资源提供程序的典型限制错误响应将类似于以下示例, () 仅显示相关的标头:

HTTP/1.1 429 Too Many Requests
x-ms-ratelimit-remaining-resource: Microsoft.Compute/HighCostGet;0
Retry-After: 1200
Content-Type: application/json; charset=utf-8
{
  "code": "OperationNotAllowed",
  "message": "The server rejected the request because too many requests have been received for this subscription.",
  "details": [
    {
      "code": "TooManyRequests",
      "target": "HighCostGet",
      "message": "{\"operationGroup\":\"HighCostGet\",\"startTime\":\"2018-06-29T19:54:21.0914017+00:00\",\"endTime\":\"2018-06-29T20:14:21.0914017+00:00\",\"allowedRequestCount\":300,\"measuredRequestCount\":1238}"
    }
  ]
}

剩余调用计数为 0 的策略是返回限制错误的策略。 在本例中为 HighCostGet。 响应正文的整体格式是常规 Azure 资源管理器 API 错误格式, (符合 OData) 。 main错误代码 OperationNotAllowed是计算资源提供程序用于报告限制错误的错误代码, (其他类型的客户端错误) 。 message内部错误 () 的 属性包含序列化的 JSON 结构,其中包含限制冲突的详细信息。

如上图所示,每个限制错误都包含 Retry-After 标头,该标头提供客户端在重试请求之前应等待的最小秒数。

API 调用速率和限制错误分析器

故障排除功能的预览版本适用于计算资源提供程序的 API。 这些 PowerShell cmdlet 提供有关每个操作每个时间间隔的 API 请求速率以及每个操作组 (策略) 限制冲突的统计信息:

API 调用统计信息可以深入了解订阅客户端 () 的行为,并轻松识别导致限制的调用模式。

分析器的一个暂时限制是,它不计算对磁盘的请求,快照资源类型 (支持托管磁盘) 。 由于它从 CRP 的遥测中收集数据,因此也无法帮助识别 ARM 中的限制错误。 但是,可以根据独特的 ARM 响应标头轻松识别这些标头,如前所述。

PowerShell cmdlet 使用 REST 服务 API,客户端可以直接直接调用该 API, (但尚未) 正式支持。 若要查看 HTTP 请求格式,请使用 -Debug 开关运行 cmdlet,或者在使用 Fiddler 执行 cmdlet 时进行窥探。

最佳做法

  • 不要无条件地和/或立即重试 Azure 服务 API 错误。 常见的情况是客户端代码在遇到无法重试的错误时进入快速重试循环。 重试最终会耗尽目标操作组允许的调用限制,并影响订阅的其他客户端。
  • 在高容量 API 自动化情况下,当目标操作组的可用调用计数低于某个低阈值时,请考虑实现主动客户端自限制。
  • 跟踪异步操作时,请遵循 Retry-After 标头提示。
  • 如果客户端代码需要有关特定虚拟机的信息,请直接查询该 VM,而不是列出包含资源组或整个订阅中的所有 VM,然后在客户端上选取所需的 VM。
  • 如果客户端代码需要来自特定 Azure 位置的 VM、磁盘和快照,请使用基于位置的查询形式,而不是查询所有订阅 VM,然后在客户端按位置进行筛选: GET /subscriptions/<subId>/providers/Microsoft.Compute/locations/<location>/virtualMachines?api-version=2017-03-30 查询到计算资源提供程序区域终结点。
  • 创建或更新 API 资源(特别是 VM 和虚拟机规模集)时,跟踪返回的异步操作以完成比基于 provisioningState) (对资源 URL 本身进行轮询要高效得多。

后续步骤

有关 Azure 中其他服务的重试指南的详细信息,请参阅 特定服务的重试指南

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。