本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 Amazon SQS ReceiveMessage API 呼叫未傳回的訊息進行故障診斷
下列主題涵蓋無法將 Amazon SQS 訊息傳回給消費者的最常見原因,以及如何進行疑難排解。如需詳細資訊,請參閱 AWS 知識中心指南中的為什麼我無法接收來自 Amazon SQS 佇列的訊息?
空佇列
若要判斷佇列是否為空,請使用長輪詢來呼叫 ReceiveMessage
API。您也可以使用 ApproximateNumberOfMessagesVisible
、 ApproximateNumberOfMessagesNotVisible
和 ApproximateNumberOfMessagesDelayed
CloudWatch 指標。如果所有指標值都設定為 0 幾分鐘,則佇列會被視為空白。
已達到飛行中限制
如果您使用長輪詢,且佇列的飛行中限制 (FIFO 為 20000,標準為 120000) 遭到違反,Amazon SQS 將不會傳回超過配額限制的錯誤訊息。
訊息延遲
如果 Amazon SQS 佇列設定為延遲佇列,或使用訊息計時器傳送訊息,則在延遲時間結束之前不會顯示訊息。若要驗證佇列是否設定為延遲佇列,請使用 GetQueueAttributes
API DelaySeconds
屬性,或在交付延遲下從佇列主控台進行。檢查 ApproximateNumberOfMessagesDelayed CloudWatch 指標以了解是否有任何訊息延遲。
訊息正在處理中
如果不同的取用者輪詢訊息,則訊息在可見性逾時期間會處於進行中或隱藏狀態。其他輪詢可能會傳回空的接收。檢查ApproximateNumberOfMessagesVisible CloudWatch 指標,以了解可接收的訊息數量。在 FIFO 佇列中,如果訊息群組 ID 為進行中的訊息,則除非您刪除訊息,否則不會再傳回任何訊息,否則會顯示訊息。這是因為訊息排序會維持在 FIFO 佇列中的訊息群組層級。
輪詢方法
如果您使用短輪詢,(WaitTimeSeconds 為 0) Amazon SQS 會取樣其伺服器子集,並僅傳回來自這些伺服器的訊息。因此,即使訊息可供接收,您也可能無法取得訊息。後續輪詢請求將傳回訊息。
如果您使用的是長輪詢,Amazon SQS 會輪詢所有伺服器,並在收集至少一個可用訊息後傳送回應,最多達指定的數量上限。如果 ReceiveMessage WaitTimeSeconds 的值太低,您可能不會收到所有可用的訊息。