排查 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 - 内部服务器错误 ,并显示 以下 消息。

    {
    “Message”:“发生错误。
    }

  • 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”,
    “已用”: “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 检查器跟踪的相同过程,我们应该在“转发请求”响应属性下看到 HTTP 500 状态代码。

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

    forward-request (841.060 ms)
    {
    “response”: {
    “status”: {
    “code”: 500,
    “reason”: “Internal Server Error”
    }

  • 对于第三个问题(HTTP 429 - 请求过多),看起来你遇到 API 调用速率限制。 可能可以检查操作级别是否实施了任何“rate-limit”或“rate-limit-by-key”策略。

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

  • 在这里,你应该注意到,某些策略是在 API 级别实现的,这些策略不会真正限制 API 调用速率,而是通过在出站部分中将自定义响应返回给客户端来模拟其操作。

    <?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 反馈社区