當我呼叫 ReceiveMessage API 時,我的 Amazon Simple Queue Service (Amazon SQS) 先進先出 (FIFO) 佇列不會傳回某些訊息。
解決方案
當您使用 FIFO 佇列時,您無法請求接收來自特定訊息群組 ID 的訊息。您也無法篩選 ReceiveMessage API 呼叫,讓其一次僅傳回一則訊息群組內的訊息。
在 ReceiveMessage API 呼叫中指定 MaxNumberOfMessages 參數時,SQS 會盡可能傳回具有相同訊息群組 ID 的多則訊息。ReceiveMessage API 呼叫還可以傳回來自其他可用訊息群組的訊息。
對於 FIFO 佇列,當您收到屬於特定訊息群組 ID 的訊息時,請注意下列準則:
- 您必須先刪除目前訊息群組 ID 中的訊息,才能接收相同訊息群組 ID 內的更多訊息。
- 接收但尚未刪除的訊息處於進行中狀態。進行中的訊息會封鎖相同訊息群組內的可用訊息傳送。
- 訊息處於進行中狀態的常見原因是取用者用戶端意外失敗。另一個原因是下游 AWS Lambda 取用者函數遇到例外狀況或達到其並行上限。
- ChangeMessageVisibility API 可延長或縮短進行中訊息的可見性逾時期。
- 您可以等到訊息可見性逾時期間到期再允許訊息重新傳遞。
對於所有 FIFO 佇列和 Amazon SQS 配額限制,請注意下列準則:
-
FIFO 佇列最多可以有 120,000 則進行中的訊息。
**注意:**Amazon SQS 不會傳回超過配額限制的錯誤訊息。
-
FIFO 佇列最多可以處理每秒 300 次交易 (TPS),而無需啟用高輸送量。即使可以使用佇列中的訊息,超過 300 個 TPS 的請求也會出現 "ThrottlingException" 錯誤。
-
SQS FIFO 佇列訊息儲存在分割區中。每個分割區最多會支援 300 個 TPS 以進行傳送、接收和刪除作業。如需詳細資訊,請參閱最佳化分割區使用率。
-
具有高輸送量的 FIFO 佇列可以與多個訊息群組共用一個分割區。如果訊息群組的分割區超過 300 個 TPS,則由於限流而不會傳遞來自該分割區上其他群組的訊息。
-
FIFO 佇列每秒的高輸送量交易次數會因 AWS 區域而異。如需詳細資訊,請參閱 Amazon SQS 訊息配額。
若要降低 FIFO 佇列的 Amazon SQS 輸送量限制,請注意下列準則:
FIFO 佇列會查看前 120,000 則訊息,以確定可用的訊息群組。如果前 120,000 則訊息中的訊息群組因為進行中的訊息而遭到封鎖,則系統將不會傳回前 120,000 則訊息以外的其他群組訊息。如需詳細資訊,請參閱避免 Amazon SQS 內相同訊息群組 ID 的訊息大量殘留。
範例 A
FIFO 佇列總共有 120,001 則訊息。前 120,000 則屬於訊息群組 1,最後一則訊息屬於訊息群組 2。在嘗試從佇列接收訊息時,僅會收到來自群組 1 的訊息。任何連續 ReceiveMessage API 呼叫都會導致空接收。發生這種情況是因為 FIFO 僅會查看屬於群組 1 的訊息,而該群組會遭目前呼叫封鎖。
範例 B
FIFO 佇列總共有 120,000 則訊息。前 119,999 則屬於訊息群組 1,最後一則訊息屬於訊息群組 2。在嘗試從佇列接收訊息時,第一個 ReceiveMessage 呼叫會收到屬於群組 1 的訊息。第二個 ReceiveMessage 呼叫會收到屬於群組 2 的訊息。任何其他 ReceiveMessage 呼叫都會導致空接收,因為現在兩個群組都會遭目前呼叫封鎖。
相關資訊
使用 Amazon Simple Queue Service 佇列