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