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

2 分的閱讀內容
0

當我呼叫 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 佇列最多有 20,000 則進行中的訊息。
    **注意事項:**Amazon SQS 不會傳回超過配額限制的錯誤訊息。
  • FIFO 佇列最多可以處理每秒 300 次交易 (TPS),而無需啟用高輸送量。即使可以使用佇列中的訊息,超過 300 個 TPS 的請求也會出現 "ThrottlingException" 錯誤。
  • SQS FIFO 佇列訊息儲存在分割區中。每個分割區最多會支援 300 個 TPS 以進行傳送、接收和刪除作業。如需詳細資訊,請參閱最佳化分割區使用率
  • 具有高輸送量的 FIFO 佇列可以與多個訊息群組共用一個分割區。如果訊息群組的分割區超過 300 個 TPS,則由於限流而不會傳遞來自該分割區上其他群組的訊息。
  • FIFO 佇列每秒高輸送量交易量因 AWS 區域而異。如需詳細資訊,請參閱與訊息相關的配額

若要降低 FIFO 佇列的 Amazon SQS 輸送量限制,請注意下列準則:

FIFO 佇列會查看前 20,000 則訊息,以確定可用的訊息群組。如果前 20,000 則訊息中的訊息群組因為進行中的訊息而遭封鎖,則將不會傳回前 20,000 則訊息以外的其他群組的訊息。如需詳細資訊,請參閱避免相同群組 ID 的訊息大量殘留

範例 A

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

範例 B

FIFO 佇列總共有 20,000 則訊息。前 19,999 則屬於訊息群組 1,最後一則訊息屬於訊息群組 2。當您嘗試從佇列接收訊息時,第一個 ReceiveMessage 呼叫會收到屬於群組 1 的訊息。第二個 ReceiveMessage 呼叫會收到屬於群組 2 的訊息。任何其他 ReceiveMessage 呼叫都會導致空接收,因為現在兩個群組都會遭目前呼叫封鎖。

相關資訊

Amazon SQS FIFO (先進先出) 佇列

使用 Amazon SQS 訊息群組 ID

AWS 官方
AWS 官方已更新 6 個月前