排查 API 调用中的性能问题

请参阅 Azure API 管理 故障排除系列博客,这是实验室的第四个方案。 请确保已按照实验室设置说明 进行操作,以重新创建问题。

原始产品版本:API 管理服务
原始 KB 编号: 4464929

症状

APIM 中的 API ProductStore 与后端终结点通信, (https://productstoreapp.azurewebsites.net) 在需要时轻松创建、读取、更新和删除记录。 但是,在调用下面列出的 API 操作时,可能会遇到一些性能问题和异常。 为便于测试,请仅保留三个产品 ID 范围从 1 到 3。

  • 其中一个 API 函数 Products_GetAllProducts 需要 5 秒才能返回结果,而预期响应时间小于 1 秒。

  • 删除具有上述任何 ID (1 到 3) 的产品时,通过调用 Products_DeleteProduct 操作,收到 HTTP 500 - 内部服务器错误,并显示以下消息。

    {
    “消息”:“发生错误。”
    }

  • Products_PutProduct 更新产品的操作意外受到限制,从而引发 HTTP 429 - 请求过多 ,并显示以下错误消息,而不管在请求中发送的产品 ID 和请求正文如何。 例如,如果客户更新产品价格的“番茄汤”,其产品 ID = 1,并使用以下 Json 正文,则他会收到 HTTP 429 状态代码。

    模板参数 ID: 1
       请求正文: {“Name”: “番茄汤”,“类别”: “杂货”,“价格”: 2.45}
       响应正文:
    {
    超出速率限制。 一段时间后重试。
    }

故障排除步骤

  • 排查性能问题时,故障隔离技术的最佳方法是捕获 [APIM 检查器跟踪,该跟踪显示每个部分中 (入站/后端/出站) 所花费的时间。

  • 如果分析第一个问题的 API 检查器跟踪,你会注意到后端部分大部分时间 (大约 5 秒) ,这意味着后端正在执行一些缓慢或长时间运行的操作。

    “source”:“forward-request”,
    “timestamp”: “2018-07-29T16:16:46.6615081Z”,
    “elapsed”: “00:00:05.5844430”,“data”: {
    “response”: {
    “status”: {
    “code”: 200,
    “reason”: “OK”
    }

  • 一旦发现速度缓慢在后端,需要调查 Web API 应用程序的后端应用程序代码。 对于无权访问后端的方案,可以在 APIM 级别实现缓存,如下所示。 了解如何实现缓存策略以提高 Azure API 管理的性能。

    <?xml version="1.0" encoding="UTF-8"?>
    <policies>
       <inbound>
          <base />
          <cache-lookup vary-by-developer="true" vary-by-developer-groups="true" must-revalidate="true" downstream-caching-type="public" />
       </inbound>
       <backend>
          <base />
       </backend>
       <outbound>
          <base />
          <cache-store duration="60" />
       </outbound>
       <on-error>
          <base />
       </on-error>
    </policies>
    
  • 对于第二个问题 (HTTP 500 - 内部服务器错误) ,请遵循分析 APIM 检查器跟踪的相同过程,应在“forward-request”响应属性下看到 HTTP 500 状态代码。

  • 这意味着后端 API 返回了 HTTP 500,因为后端代码中发生了一些未经处理的异常,APIM 级别没有问题。

    转发请求 (841.060 毫秒)
    {
    “response”: {
    “status”: {
    “code”: 500,
    “reason”:“内部服务器错误”
    }

  • 对于第三个问题 (HTTP 429 - 请求过多) 似乎达到了 API 调用速率限制。 如果在操作级别实施了任何“速率限制”或“按键速率限制”策略,则可能可以检查。

  • 如果在操作级别找不到任何此类策略,请单击“ 计算有效策略 ”按钮,该按钮将显示来自不同级别的所有继承策略,就像产品级别的某些策略可能会导致此问题一样。

  • 此处应注意到,某些策略是在 API 级别实现的,这些策略不会真正限制 API 调用速率,而是通过在出站部分使用“return-response”和“set-status”策略将自定义响应返回给客户端来模拟其操作。

    <?xml version="1.0" encoding="UTF-8"?>
    <outbound>
       <!--base: Begin Api scope-->
       <return-response>
          <set-status code="429" reason="Too many requests" />
          <set-body><![CDATA[{
    
    Rate limit is exceeded. Try again after some time.
    
    }]]></set-body>
       </return-response>
       <!--base: End Api scope-->
    </outbound>
    

联系我们寻求帮助

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