请参阅有关 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 反馈社区。