排查 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 反馈社区提交产品反馈。