共用方式為


針對 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 意見反應社群提交產品意見反應。