

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SQS の FIFO キュー配信ロジック
<a name="FIFO-queues-understanding-logic"></a>

以下の概念では、Amazon SQS FIFO キューがメッセージの送受信を処理する方法、特にメッセージの順序付けとメッセージグループ ID を処理する方法について説明します。

## メッセージの送信
<a name="FIFO-sending-messages"></a>

Amazon SQS FIFO キューは、一意の重複排除 ID とメッセージグループ ID を使用してメッセージの順序を維持します。このトピックでは、グループ内で厳密な順序を維持するためのメッセージグループ ID の重要性と、複数のプロデューサー間で信頼性が高く順序付けられたメッセージ配信を確保するためのベストプラクティスについて説明します。

1. **順序の保存**
   + 複数のメッセージが一意のメッセージ重複排除 ID とともに FIFO キューへ連続して送信されると、Amazon SQS はそれらを保存し、その送信を確認します。その後、これらのメッセージは、その送信順序どおりに正確に受信して処理されます。

1. **メッセージグループ ID**
   + FIFO キューでは、メッセージはメッセージグループ ID に基づいて順序付けられます。複数のプロデューサーまたはスレッドが同じメッセージグループ ID でメッセージを送信する場合、Amazon SQS はそれらが到着した順序で保存および処理されるようにします。
   + ベストプラクティス: 複数のプロデューサー間で厳密なメッセージ順序を保証するため、各プロデューサーからのすべてのメッセージに一意のメッセージグループ ID を割り当てます。

1. **グループごとの順序付け**
   + **FIFO キューロジックはメッセージグループ ID ごとにのみ適用されます:**
     + 各メッセージグループ ID は、メッセージの異なる順序付けされたグループを表します。
     + メッセージグループ ID 内で、すべてのメッセージが厳密な順序で送受信されます。
     + メッセージグループ ID が異なるメッセージは、互いに順序どおりに到着または処理されない場合があります。
   + **要件** - メッセージグループ ID を各メッセージに関連付ける必要があります。グループ ID なしでメッセージを送信すると、アクションは失敗します。
   + **単一グループのシナリオ** - すべてのメッセージを厳密な順序で処理する必要がある場合は、すべてのメッセージに同じメッセージグループ ID を使用します。

## メッセージの受信
<a name="FIFO-receiving-messages"></a>

Amazon SQS の FIFO キューは、バッチ処理、FIFO 順序の保証、および特定のメッセージグループ ID をリクエストする際の制限を含め、メッセージの取得を処理します。このトピックでは、Amazon SQS が厳密な順序および可視性ルールを維持しながら、メッセージグループ ID 内およびそれらの間でメッセージを取得する方法について説明します。

1. **バッチの取得**
   + 複数のメッセージグループ ID を持つ FIFO キューからメッセージを受信する場合、Amazon SQS は以下のように動作します。
     + 1 回の呼び出しで、同じメッセージグループ ID を持つメッセージをできるだけ多く返そうとする。
     + 他のコンシューマーが、異なるメッセージグループ ID のメッセージを同時に処理できるようにする。
   + **重要な明確化**
     + 同じメッセージグループ ID の複数のメッセージを、1 つのバッチで受信することがあります (`MaxNumberOfMessages` パラメータでは 1 回の呼び出しで最大 10 個のメッセージ）。
     + ただし、後続のリクエストでは、次の条件が満たされるまで、同じメッセージグループ ID から追加のメッセージを受信することはできません。
       + 現在受信されているメッセージが削除される、または
       + それらが再び表示される (可視性タイムアウトの有効期限が切れた後など)。

1. **FIFO 順序の保証**
   + バッチで取得されたメッセージは、FIFO 順序をグループ内で保持します。
   + 同じメッセージグループ ID で使用できるメッセージが 10 件未満の場合、Amazon SQS は同じバッチ内の他のメッセージグループ ID からのメッセージを含めることができますが、各グループは FIFO 順序を保持します。

1. **コンシューマーの制限**
   + 特定のメッセージグループ ID からメッセージを受信するように明示的にリクエストすることはできません。

## 複数回の再試行
<a name="FIFO-retrying-multiple-times"></a>

Amazon SQS の FIFO キューでは、プロデューサーやコンシューマーが失敗した操作を、メッセージの順序を乱したり重複を生じさせることなく、安全に再試行できます。このトピックでは、重複排除 ID と可視性タイムアウトにより、再試行時にメッセージの整合性がどのように確保されるかについて説明します。

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 つの確認を受け取る限り、再試行によって以下は発生しません。
     + 重複したメッセージの導入。
     + メッセージの順序の中断。

1. **コンシューマーの再試行**
   + [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) アクションが失敗しても、コンシューマーは同じ受信リクエスト試行 ID を使用して、必要な回数だけ再試行できます。
   + 可視性タイムアウトの期限が切れる前に、コンシューマーが少なくとも 1 つの確認を受け取る限り、再試行によって以下は発生しません。
     + メッセージの順序の中断。

## FIFO 動作に関するその他の注意事項
<a name="FIFO-behavior"></a>

可視性タイムアウトの管理、複数のメッセージグループ ID を使った並列処理の有効化、単一グループでの厳密な順序処理の確保について説明します。

1. **可視性タイムアウトの処理**
   + メッセージは取得されても削除されていない場合、可視性タイムアウトの有効期限が切れるまで表示されません。
   + 最初のメッセージが削除されるか、再び表示されるまで、同じメッセージグループ ID からの追加のメッセージは返されません。

1. **同時実行処理と並列処理**
   + FIFO キューでは、異なるメッセージグループ ID 間でメッセージを並列処理できます。
   + 同時実行性を最大化するには、独立したワークフローに対複数のメッセージグループ ID を使ってシステムを設計します。

1. **単一グループのシナリオ**
   + FIFO キュー内のすべてのメッセージを厳密に順序通り処理するには、キュー内のすべてのメッセージに対して単一のメッセージグループ ID を使用します。

## 理解を深めるための例
<a name="FIFO-examples"></a>

以下は、Amazon SQS での FIFO キューの動作を説明する実用的なシナリオです。

1. **シナリオ 1: 単一グループ ID**
   + プロデューサーが同じメッセージグループ ID グループ A を持つ 5 つのメッセージを送信します。
   + コンシューマーがこれらのメッセージを FIFO 順に受信します。コンシューマーがこれらのメッセージを削除するか、可視性タイムアウトの有効期限が切れるまで、グループ A から追加のメッセージは受信されません。

1. **シナリオ 2: 複数のグループ ID**
   + プロデューサーがグループ A に 5 つのメッセージを送信し、グループ B に 5 つのメッセージを送信します。
   + コンシューマー 1 がグループ A からのメッセージを処理し、コンシューマー 2 はグループ B からのメッセージを処理します。これにより、厳密に順序通りに各グループ内での並列処理が可能になります。

1. **シナリオ 3: バッチの取得**
   + プロデューサーがグループ A に 7 つのメッセージを送信し、グループ B に 3 つのメッセージを送信します。
   + 1 つのコンシューマーが最大 10 個のメッセージを取得します。キューが許可する場合、以下を返すことがあります。
     + グループ A から 7 件、グループ B から 3 件 (または単一グループからの利用可能なメッセージがそれ未満の場合はその数)。