為什麼我的 Amazon SQS FIFO 佇列未傳回所有訊息或其他訊息群組的訊息?

上次更新日期︰2021 年 8 月 26 日

當我呼叫 ReceiveMessage API 時,我的 Amazon Simple Queue Service (Amazon SQS) 先進先出 (FIFO) 佇列不會傳回某些訊息。為什麼我的 SQS FIFO 佇列不會傳回特定訊息群組 ID 或其他訊息群組的所有訊息?

解決方案

針對 FIFO 佇列,您無法請求接收來自特定訊息群組 ID 的訊息。當您在 ReceiveMessage API 呼叫中指定 MaxNumberOfMessages 參數時,SQS 會傳回盡可能多的具有相同訊息群組 ID 的訊息。然後,其他取用者或其他 ReceiveMessage 呼叫可以處理具有不同訊息群組 ID 的訊息。

針對 FIFO 佇列,當您收到屬於特定訊息群組 ID 的訊息時,請注意下列事項:

  • 您必須先刪除或移動目前接收呼叫中的訊息,才能從相同群組 ID 中接收更多訊息。
    注意:訊息必須從執行中的可用狀態移動。
  • 您無法在其他郵件群組中接收訊息。

FIFO 佇列會查看前 20,000 則訊息,以確定可用的訊息群組。如果前 20,000 則訊息中的所有訊息群組都因執行中訊息而遭到封鎖,則來自前 20,000 則訊息以外的群組訊息將無法傳回。如需詳細資訊,請參閱避免大量積存具有相同群組 ID 的訊息

範例 A

FIFO 佇列總計有 20,001 則訊息。前 20,000 則訊息屬於訊息群組 1,而最後一則訊息屬於訊息群組 2。當您嘗試從佇列接收訊息時,您只會接收來自群組 1 的訊息。任何連續的 ReceiveMessage 呼叫都會導致空白接收。之所以發生這種情況,是因為 FIFO 只查看屬於群組 1 的訊息,並且該群組會被目前的呼叫封鎖。

範例 B

FIFO 佇列總計有 20,000 則訊息。前 19,999 則訊息屬於訊息群組 1,而最後一則訊息屬於訊息群組 2。當您嘗試從佇列接收訊息時,第一個 ReceiveMessage 呼叫會取得屬於群組 1 的訊息。第二個 ReceiveMessage 呼叫會取得屬於群組 2 的訊息。任何額外的 ReceiveMessage 呼叫都會導致空白接收,因為這兩個群組現在都會被目前的呼叫封鎖。


此文章是否有幫助?


您是否需要帳單或技術支援?