簡體   English   中英

Azure API 管理(消費層):第一個請求超時並且不會發送到后端服務

[英]Azure API Management (consumption tier): First request gives timeout and is not sent to backend service

我有一個服務在消費層中運行的 Azure API 管理實例后面運行。 當一段時間內沒有流量發送到 API 管理實例時(15 分鍾不足以觸發它,但一個小時是),發送的第一個請求大約需要 3 分 50 秒,並返回帶有此正文內容的 HTTP 500 :

<html><head><title>500 - The request timed out.</title></head><body>  <font color ="#aa0000">         <h2>500 - The request timed out.</h2></font>  The web server failed to respond within the specified time.</body></html>

以下請求工作正常。 基於應用程序日志和通過 ngrok 指向我的本地機器的 API 管理實例的測試,看起來 API 管理甚至沒有嘗試連接到這些請求的后端。 對於本地測試,我在調試器下運行我的應用程序,在我的服務方法中放置一個斷點(沒有可能妨礙的身份驗證)並觀察 Visual Studio 中的“輸出”窗口。 它從未達到我的斷點,也從未在“500 請求超時”請求的輸出窗口中顯示任何內容。 當我向 API Management 發出另一個請求時,它按預期轉發到我的服務,為我提供輸出並點擊我的斷點。

這是 API 管理消費層的一些已知問題,我需要找到某種解決方法(即服務定期 ping 它)? 或者我設置 API 管理實例的方式可能存在配置問題?

我的 API 管理實例是通過 ARM 模板使用美國中北部的消費層部署的,並且有一些 REST 和一些 SOAP 端點(我一直用於測試的這個請求是 SOAP 請求之一,並使用信封頭來指定SOAP 操作)。

附加信息:

  • 請求問題大約是 2KB,來自服務器的響應(它不會在這種情況下發揮作用,因為調用永遠不會到達我的服務器)大約是 1KB,所以這不是請求/響應大小的問題。
  • 當我打開請求跟蹤(通過發送 Ocp-Apim-Subscription-Key + Ocp-Apim-Trace 標頭)時,我收到的這個 500 響應沒有帶有跟蹤信息的 Ocp-Apim-Trace-Location 標頭其他請求所做的。
  • 當我發送 2 個請求(獲得 4 分鍾的 500 響應,然后是正常的 5 秒 200 響應)時,我得到了這種行為,等待一個小時,然后發出另一個請求(獲得 4 分鍾的延遲和 500 響應),所以我不相信這可能與提供過多流量(至少是我的流量過多)的實例有關。
  • 進一步的測試表明,這種情況大約每 60 到 90 分鍾發生一次,即使我每分鍾發送一個請求以保持 APIM 實例“存活”也是如此。

HTTP 500(內部服務器錯誤)狀態代碼表示服務器遇到了阻止其完成請求的意外情況。 (可能是由於有效載荷較大)。 APIM 級別沒有問題。 分析 APIM 檢查器跟蹤,您應該在“轉發請求”響應屬性下看到 HTTP 500 狀態代碼。

您需要了解誰在拋出這些 HTTP 404 和 500 響應、APIM 或后端 SOAP API。 獲得該答案的最佳方法是收集 APIM 檢查器跟蹤以檢查請求和響應。 使用請求跟蹤調試您的 API

消費層公開無服務器屬性。 它在共享基礎架構上運行,可以在沒有流量的情況下縮小到零,並按執行計費。 除非后端明確關閉,否則連接會被合並和重用。 Api 管理服務限制

1.這些症狀模式通常也是由於您的 APIM 服務的網絡地址轉換 (SNAT) 端口限制而發生的。

每當客戶端調用你的 APIM API 之一時,Azure API 管理服務就會打開一個 SNAT 端口來訪問你的后端 API。 Azure 使用 SNAT 和負載均衡器(不向客戶公開)與 Azure 外部公共 IP 地址空間中的端點以及 Azure 內部未使用虛擬網絡服務端點的端點進行通信。 (這種情況只適用於暴露在公共 IP 上的后端 API。)

API 管理服務的每個實例最初都有一個預先分配的 SNAT 端口數。 該限制影響打開與相同主機和端口組合的連接。 當您重復調用相同的地址和端口組合時,SNAT 端口就會用完。 釋放 SNAT 端口后,該端口可根據需要重新使用。 Azure 網絡負載平衡器僅在等待四分鍾后才從關閉的連接中回收 SNAT 端口。

如果這些端口沒有足夠快地關閉和回收,客戶端對 API 的快速連續請求可能會耗盡預先分配的 SNAT 端口配額,從而阻止您的 APIM 服務及時處理客戶端請求。

可以考慮以下策略:

  • 為您的后端 URL 使用多個 IP
  • 將 APIM 和后端服務放在同一個 VNet 中
  • 將 APIM 置於虛擬網絡中並將出站調用路由到 Azure 防火牆
  • 考慮響應緩存和其他后端性能調整(使用響應緩存配置某些 API 以減少延遲
    在調用 API 的客戶端應用程序和 APIM 后端之間
    加載。)
  • 考慮實施訪問限制策略(該策略可用於通過限制每個指定時間段的調用率來防止基於每個密鑰的 API 使用高峰。)

2.轉發請求策略將傳入的請求轉發到請求上下文中指定的后端服務。 后端服務 URL 在 API 設置中指定,可以使用設置的后端服務策略進行更改。

政策聲明:

<forward-request timeout="time in seconds" follow-redirects="false | true" buffer-request-body="false | true" buffer-response="true | false" fail-on-error-status-code="false | true"/>

示例:以下 API 級別策略將所有 API 請求轉發到后端服務,超時間隔為 60 秒。

<!-- api level -->
<policies>
    <inbound>
        <base/>
    </inbound>
    <backend>
        <forward-request timeout="60"/>
    </backend>
    <outbound>
        <base/>
    </outbound>
</policies>

屬性:超時=“整數”

說明:在引發超時錯誤之前等待后端服務返回 HTTP 響應標頭的時間量(以秒為單位)。 最小值為 0 秒。 大於 240 秒的值可能不被接受,因為在此時間之后底層網絡基礎結構可能會丟棄空閑連接。

要求:否

默認值:無

此策略可用於以下策略部分和范圍。

  • 政策部分:后端
  • 政策范圍:所有范圍

結帳類似的反饋供您參考。 另外, 請參閱APIM 5oo 錯誤的詳細故障排除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM