

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon SQS 中的 FIFO 佇列交付邏輯
<a name="FIFO-queues-understanding-logic"></a>

下列概念說明 Amazon SQS FIFO 佇列如何處理訊息的傳送和接收，特別是在處理訊息排序和訊息群組 IDs時。

## 傳送訊息
<a name="FIFO-sending-messages"></a>

Amazon SQS FIFO 佇列會使用唯一的重複資料刪除 IDs 和訊息群組 IDs 保留訊息順序。本主題強調訊息群組 IDs 在群組內維持嚴格排序的重要性，並強調確保跨多個生產者可靠、有序訊息交付的最佳實務。

1. **訂單保留**
   + 當多個訊息連續傳送到具有唯一訊息重複資料刪除 IDs FIFO 佇列時，Amazon SQS 會儲存它們並確認其傳輸。然後，這些訊息會以其傳輸的確切順序接收和處理。

1. **訊息群組 ID**
   + 在 FIFO 佇列中，訊息會根據其訊息群組 ID 排序。如果多個生產者或執行緒以相同的訊息群組 ID 傳送訊息，Amazon SQS 會確保它們按照到達順序進行儲存和處理。
   + 最佳實務：為保證多個生產者的嚴格訊息順序，請為每個生產者的所有訊息指派唯一的訊息群組 ID。

1. **每個群組的排序**
   + **FIFO 佇列邏輯適用於每個訊息群組 ID：**
     + 每個訊息群組 ID 代表不同、有序的訊息群組。
     + 在訊息群組 ID 中，所有訊息都會以嚴格順序傳送和接收。
     + 具有不同訊息群組 IDs 的訊息可能會抵達，或無法按彼此的順序處理。
   + **要求** - 您必須將訊息群組 ID 與每個訊息建立關聯。如果傳送訊息時沒有群組 ID，動作會失敗。
   + **單一群組案例** - 如果您需要嚴格處理所有訊息，請針對每則訊息使用相同的訊息群組 ID。

## 接收訊息
<a name="FIFO-receiving-messages"></a>

Amazon SQS FIFO 佇列會處理訊息擷取，包括批次處理、FIFO 訂單保證，以及請求特定訊息群組 IDs的限制。本主題說明 Amazon SQS 如何擷取訊息群組 IDs同時維持嚴格的排序和可見性規則。

1. **批次擷取**
   + 從具有多個訊息群組 IDs FIFO 佇列接收訊息時，Amazon SQS：
     + 在單一呼叫中嘗試以相同的訊息群組 ID 傳回盡可能多的訊息。
     + 允許其他取用者同時處理來自不同訊息群組 IDs的訊息。
   + **重要說明**
     + 您可能會在一個批次中收到來自相同訊息群組 ID 的多則訊息 （使用 `MaxNumberOfMessages` 參數在單一呼叫中最多 10 則訊息）。
     + 不過，您無法在後續請求中收到來自相同訊息群組 ID 的其他訊息，直到：
       + 目前接收的訊息已刪除，或
       + 它們會再次顯示 （例如，在可見性逾時過期之後）。

1. **FIFO 訂單保證**
   + 批次中擷取的訊息會在群組中保留其 FIFO 順序。
   + 如果同一訊息群組 ID 可用的訊息少於 10 則 Amazon SQS 可能會包含來自同一批次中其他訊息群組 IDs 的訊息，但每個群組會保留 FIFO 順序。

1. **消費者限制**
   + 您無法明確請求接收來自特定訊息群組 ID 的訊息。

## 多次重試
<a name="FIFO-retrying-multiple-times"></a>

生產者和消費者可以在 Amazon SQS FIFO 佇列中安全地重試失敗的動作，而不會中斷訊息順序或引入重複項目。本主題重點介紹重複資料刪除 IDs 和可見性逾時如何在重試期間確保訊息完整性。

1. **製作者重試**
   + 如果[https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)動作失敗，生產者可以使用相同的訊息重複資料刪除 ID 重試傳送訊息多次。
   + 只要生產者在重複資料刪除間隔到期之前收到至少一個確認， 就會重試：
     + 請勿引入重複的訊息。
     + 請勿中斷訊息順序。

1. **消費者重試**
   + 如果[https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)動作失敗，消費者可以使用相同的接收請求嘗試 ID，視需要重試多次。
   + 只要消費者在可見性逾時到期之前收到至少一個確認， 就會重試：
     + 請勿中斷訊息順序。

## 有關 FIFO 行為的其他備註
<a name="FIFO-behavior"></a>

了解如何處理可見性逾時、使用多個訊息群組 IDs 啟用平行處理，並確保在單一群組案例中進行嚴格的循序處理。

1. **處理可見性逾時**
   + 當擷取訊息但未刪除時，在可見性逾時到期之前，訊息將保持不可見狀態。
   + 在刪除第一個訊息或再次顯示之前，不會傳回來自相同訊息群組 ID 的其他訊息。

1. **並行和平行處理**
   + FIFO 佇列允許跨不同訊息群組 IDs平行處理訊息。
   + 若要最大化並行，請使用多個訊息群組 IDs為獨立工作流程設計系統。

1. **單一群組案例**
   + 若要嚴格循序處理 FIFO 佇列中的所有訊息，請針對佇列中的所有訊息使用單一訊息群組 ID。

## 更好地理解的範例
<a name="FIFO-examples"></a>

以下是說明 Amazon SQS 中 FIFO 佇列行為的實際案例。

1. **案例 1：單一群組 ID**
   + 生產者傳送具有相同訊息群組 ID 群組 A 的五則訊息。
   + 消費者以 FIFO 順序接收這些訊息。在消費者刪除這些訊息或可見性逾時過期之前，不會收到群組 A 的其他訊息。

1. **案例 2：多個群組 IDs**
   + 生產者將五則訊息傳送至群組 A，並將 5 傳送至群組 B。
   + 消費者 1 處理來自群組 A 的訊息，而消費者 2 處理來自群組 B 的訊息。這可讓平行處理在每個群組中維持嚴格的順序。

1. **案例 3：批次擷取**
   + 生產者將七則訊息傳送至群組 A，並將三則訊息傳送至群組 B。
   + 單一取用者最多擷取 10 則訊息。如果佇列允許，可能會傳回：
     + 來自群組 A 的七則訊息和來自群組 B 的三則訊息 （如果單一群組可用的訊息較少，則為更少）。