針對 API 呼叫中的效能問題進行疑難解答
請參閱 Azure API 管理 疑難解答系列上的部落格,這是實驗室的第四個案例。 請確定您已依照此指示遵循實驗室設定指示,以重新建立問題。
原始產品版本:API 管理 服務
原始 KB 編號: 4464929
徵兆
APIM 中的 API ProductStore 會與後端端點 (https://productstoreapp.azurewebsites.net
) 通訊,以在需要時輕鬆地建立、讀取、更新和刪除記錄。 不過,在叫用下面所列的 API 作業時,您可能會面臨一些效能問題和例外狀況。 為了簡化測試,只保留三個標識符範圍從 1 到 3 的產品。
其中一個 API 函 式 Products_GetAllProducts需要 5 秒才能傳回結果,而預期的回應時間小於一秒。
刪除具有上述任何識別碼(1 到 3)的產品時,您會透過呼叫 Products_DeleteProduct 作業,收到 HTTP 500 - 內部伺服器錯誤,並顯示下列訊息。
{
“Message”: “發生錯誤。
}Products_PutProduct更新產品的作業意外遭到節流,擲回 HTTP 429 - 太多要求,並顯示下列錯誤訊息,而不論您在要求中傳送的產品標識碼和要求本文為何。 例如,如果客戶更新產品價格「番茄湯」的產品標識碼 = 1,且其 Json 本文如下,他就會取得 HTTP 429 狀態代碼。
範本參數標識碼: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偵測器追蹤的相同程式,我們應該在 「轉寄要求」回應屬性下看到 HTTP 500 狀態代碼。
這表示後端 API 因為後端程式代碼發生一些未處理的例外狀況,所以傳回 HTTP 500,APIM 層級沒有任何問題。
forward-request (841.060 毫秒)
{
“response”: {
“status”: {
“code”: 500,
“reason”: “Internal Server Error”
}針對第三個問題 (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 community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。