您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
在 API Proxy 呼叫後,用戶端應用程式會取得 HTTP 回應狀態 503
,以及 Service Unavailable
訊息。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 503 Service Unavailable
此外,您可能會遇到以下錯誤訊息:
{ "fault": { "faultstring": "The Service is temporarily unavailable", "detail": { "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable" } } }
可能原因
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
目標伺服器太早關閉連線 | 目標伺服器提早結束連線,而訊息處理器仍在傳送要求酬載。 | Edge Public and Private Cloud 使用者 |
常見診斷步驟
判斷失敗要求的郵件 ID
追蹤工具
如何使用追蹤工具判斷失敗要求的郵件 ID:
- 如果問題仍未解決,請為受影響的 API 啟用 追蹤記錄工作階段。
- 發出 API 呼叫並重現問題:
503 Service Unavailable
(錯誤代碼messaging.adaptors.http.flow.ServiceUnavailable.
) - 請選取其中一個失敗的要求。
- 前往 AX 階段,在「階段詳細資料」部分向下捲動,判斷要求的訊息 ID (
X-Apigee.Message-ID
),如下圖所示。
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-codeMessaging.adaptors.http.flow.ServiceUnavailable 出現任何
503
錯誤,請留意一或多項這類要求的訊息 ID,如以下範例所示:顯示
503
錯誤的範例項目
原因:目標伺服器太早關閉連線
診斷
- 如果您是公有雲或私有雲使用者:
- 使用追蹤工具 (如常見診斷步驟所述),並確認您在「Analytics (分析) 資料記錄」窗格中已進行以下兩項設定:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- 使用追蹤記錄工具 (如常見診斷步驟所述),並在
TARGET_REQ_FLOW
state 屬性後,立即在「Error」窗格中設定以下兩項內容:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- 詳情請參閱使用 tcpdump。
- 使用追蹤工具 (如常見診斷步驟所述),並確認您在「Analytics (分析) 資料記錄」窗格中已進行以下兩項設定:
- 如果您是 Private Cloud 使用者:
- 判斷失敗要求的訊息 ID。
- 在訊息處理器記錄檔 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) 中搜尋訊息 ID。 - 您會看到下列其中一種例外狀況:
例外狀況 #1:java.io.IOException:寫入 Channel 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: Broken pipe2021-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 使用者,請提供下列資訊:
- 觀察失敗要求的完整錯誤訊息
- 您要觀察到
503
錯誤的機構、環境名稱和 API Proxy 名稱 - 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