本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 Amazon SQS ReceiveMessage API 呼叫未傳回的訊息進行疑難排解
下列主題涵蓋 Amazon SQS 訊息可能無法傳回給消費者的最常見原因,以及如何進行疑難排解。如需詳細資訊,請參閱為什麼我無法從 Amazon SQS 佇列接收訊息
清空佇列
若要判斷佇列是否為空,請使用長輪詢呼叫 ReceiveMessage
API。您也可以使用ApproximateNumberOfMessagesVisible
ApproximateNumberOfMessagesNotVisible
、和ApproximateNumberOfMessagesDelayed
CloudWatch 量度。如果所有測量結果值都設為 0 數分鐘,佇列就會被視為空白。
達到飛行限制
如果您使用長輪詢,而且違反佇列的飛行限制 (FIFO 為 20000,預設為標準為 120000),Amazon SQS 將不會傳回超過配額限制的錯誤訊息。
訊息延遲
如果 Amazon SQS 佇列設定為延遲佇列,或是使用訊息計時器傳送訊息,則在延遲時間結束之前都不會顯示訊息。若要確認佇列是否設定為延遲佇列,請使用 GetQueueAttributes
API DelaySeconds
屬性,或從 [傳遞延遲] 下的佇列主控台。檢查ApproximateNumberOfMessagesDelayed CloudWatch 測量結果以瞭解是否有任何訊息延遲。
訊息正在進行中
如果有不同的消費者輪詢了訊息,訊息將處於暫停狀態,或在可見性逾時期間看不見訊息。額外的民意調查可能會傳回空的接收。檢查ApproximateNumberOfMessagesVisible CloudWatch測量結果以瞭解可接收的訊息數目。在 FIFO 佇列的情況下,如果具有訊息群組識別碼的訊息正在進行中,則除非您刪除該訊息或變成可見,否則不會再傳回任何訊息。這是因為訊息排序會維持在 FIFO 佇列中的訊息群組層級。
輪詢方法
如果您使用的WaitTimeSeconds是短輪詢,(為 0) Amazon SQS 會對其伺服器的一個子集進行抽樣,並僅從這些伺服器傳回訊息。因此,即使可以接收郵件,您也可能無法收到這些消息。後續的輪詢要求將傳回訊息。
如果您使用長輪詢,Amazon SQS 會輪詢所有伺服器,並在收集至少一個可用訊息並達到指定的最大數目之後傳送回應。如果的值 ReceiveMessage WaitTimeSeconds太低,您可能不會收到所有可用的訊息。