查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式收到 HTTP 回應狀態 503
及訊息
Service Unavailable
追蹤 API Proxy 呼叫。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 503 Service Unavailable
此外,您也可能會看到下列錯誤訊息:
{ "fault": { "faultstring": "The Service is temporarily unavailable", "detail": { "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable" } } }
可能原因
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
目標伺服器連線過早 | 目標伺服器在訊息處理器仍在運作時提前結束連線 傳送要求酬載 | 邊緣公有雲和私有雲使用者 |
常見的診斷步驟
找出失敗要求的訊息 ID
追蹤工具
如要使用追蹤工具找出失敗要求的訊息 ID,請按照下列步驟操作:
- 如果問題仍未解決,請啟用 追蹤工作階段。
- 發出 API 呼叫並重現問題 -
503 Service Unavailable
錯誤代碼:messaging.adaptors.http.flow.ServiceUnavailable.
- 請選取其中一個失敗的要求。
- 前往 AX 階段,然後找出郵件 ID
(
X-Apigee.Message-ID
) 方法是向下捲動, 「Phase Details」部分,如下圖所示。
NGINX 存取記錄
如何使用 NGINX 存取記錄判斷失敗要求的訊息 ID:
您也可以參閱 NGINX 存取記錄,找出 503
錯誤的郵件 ID。
如果過去曾經發生問題或問題持續發生,這項功能就特別實用
,您也無法在 UI 中擷取追蹤記錄。請按照下列步驟,根據 NGINX 存取記錄判斷這項資訊:
- 查看 NGINX 存取記錄:(
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) - 搜尋特定 API Proxy 在指定期間內是否有任何
503
錯誤 (如果問題是過去發生),或是仍有任何要求因503
而失敗。 - 如果 X-Apigee-fault-code message.adaptors.http.flow.ServiceUnavailable 有任何
503
錯誤, 記下一或多個這類要求的郵件 ID,如以下範例所示:顯示
503
錯誤的範例項目
原因:目標伺服器連線過早
診斷
- 如果您是公有雲或 Private Cloud 使用者:
- 使用追蹤工具 (如常見診斷步驟中所述)
,然後確認您已在「Analytics 資料記錄」窗格中完成以下兩個設定:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- 使用追蹤工具 (如常見診斷步驟中所述)
然後,檢查您是否在「Error」窗格中完成以下兩個設定,
TARGET_REQ_FLOW
state 屬性:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- 如要進一步調查,請參閱使用 tcpdump。
- 使用追蹤工具 (如常見診斷步驟中所述)
,然後確認您已在「Analytics 資料記錄」窗格中完成以下兩個設定:
- 如果您是 Private Cloud 使用者:
- 找出失敗要求的訊息 ID。
- 在訊息處理者記錄中搜尋郵件 ID
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
)。 - 您會看到下列其中一項例外狀況:
例外狀況 #1:java.io.IOException:寫入管道 ClientOutputChannel 時發生毀損的管道
2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy rev:1 messageid:myorg-opdk-test-1-30312-13747-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel(ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1 bytesRead=0 bytesWritten=76295 age=2012ms lastIO=2ms isOpen=false)
或
例外狀況 #2:onExceptionWrite 例外狀況:{}
java.io.IOException:管道無效2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() : ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms lastIO=2 ms isOpen=false.onExceptionWrite exception: {} java.io.IOException: Broken pipe
- 這兩種例外狀況都指出「訊息處理者」仍在寫入中
要求將酬載傳送至後端伺服器,導致連線提前關閉
後端伺服器因此,訊息處理器會擲回例外狀況
java.io.IOException: Broken pipe
。 Remote:IP:PORT
表示已解析的後端伺服器 IP 位址和通訊埠編號- 上述錯誤訊息中的
bytesWritten=76295
屬性代表 訊息處理器已將76295
個位元組的酬載傳送至後端 伺服器。 - 屬性
bytesRead=0
表示訊息處理器並未 接收來自後端伺服器的任何資料 (回應)。 - 如要進一步調查這個問題,請在後端收集
tcpdump
伺服器或訊息處理器,然後依據下文說明進行分析。
使用 tcpdump
-
在後端伺服器或訊息處理器擷取
tcpdump
下列指令:在後端伺服器上收集
tcpdump
的指令:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
收集
tcpdump
至訊息處理器的指令:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- 分析擷取的
tcpdump
:透過訊息處理器收集的 tcpdump 輸出內容範例:
在上述
tcpdump
中,您可以看到:- 在
4
封包中,訊息處理者將POST
要求傳送至 後端伺服器 - 在
5
、8
、9
、10
封包中11
,訊息處理器會繼續將要求酬載傳送至 後端伺服器 - 在封包
6
和7
中,後端伺服器傳回以下值:ACK
代表訊息處理器所接收要求酬載的部分。 - 但在封包
12
中,而不是以ACK
回應 然後針對接收到的應用程式資料封包進行回應 酬載,後端伺服器會回應FIN ACK
來啟動 連線關閉。 - 這清楚顯示後端伺服器太早關閉連線 訊息處理程式仍在傳送要求承載時。
- 這會導致訊息處理器記錄
IOException: Broken Pipe
錯誤並傳回503
給用戶端
- 在
解析度
- 與您的應用程式和網路團隊合作,或兩者共同分析及修正 後端伺服器端發生過早連線中斷問題
- 確保後端伺服器應用程式沒有逾時或重設連線 再接收整個要求酬載
- 如果您有任何中介網路裝置或在 Apigee 和後端伺服器之間 然後在接收整個要求裝載之前逾時。
如果問題仍未解決,請參閱「必須收集診斷資訊」。
必須收集診斷資訊
如果按照上述說明操作後仍無法解決問題,請收集下列資訊 ,然後與 Apigee Edge 支援團隊聯絡:
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成
curl
指令來重現503
錯誤 - 含有
503 Service Unavailable
錯誤要求的追蹤檔 - 如果目前沒有發生
503
錯誤,請提供時間範圍 顯示過去503
個錯誤發生的時區資訊。
如果您是 Private Cloud 使用者,請提供下列資訊:
- 偵測到失敗要求的完整錯誤訊息
- 要觀察的機構、環境名稱和 API Proxy 名稱
503
個錯誤 - API Proxy 套裝組合
- 含有
503 Service Unavailable
錯誤要求的追蹤檔 - NGINX 存取記錄
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 訊息處理器記錄
/opt/apigee/var/log/edge-message-processor/logs/system.log
- 含有時區資訊發生
503
錯誤的時間範圍 - 收到要求時,訊息處理器和後端伺服器上收集的
Tcpdumps
發生錯誤