Amazon SQS の FIFO キュー配信ロジック - Amazon Simple Queue Service

Amazon SQS の FIFO キュー配信ロジック

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

メッセージの送信

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

  1. 順序の保存

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

  2. メッセージグループ ID

    • FIFO キューでは、メッセージはメッセージグループ ID に基づいて順序付けられます。複数のプロデューサーまたはスレッドが同じメッセージグループ ID でメッセージを送信する場合、Amazon SQS はそれらが到着した順序で保存および処理されるようにします。

    • ベストプラクティス: 複数のプロデューサー間で厳密なメッセージ順序を保証するため、各プロデューサーからのすべてのメッセージに一意のメッセージグループ ID を割り当てます。

  3. グループごとの順序付け

    • FIFO キューロジックはメッセージグループ ID ごとにのみ適用されます:

      • 各メッセージグループ ID は、メッセージの異なる順序付けされたグループを表します。

      • メッセージグループ ID 内で、すべてのメッセージが厳密な順序で送受信されます。

      • メッセージグループ ID が異なるメッセージは、互いに順序どおりに到着または処理されない場合があります。

    • 要件 - メッセージグループ ID を各メッセージに関連付ける必要があります。グループ ID なしでメッセージを送信すると、アクションは失敗します。

    • 単一グループのシナリオ - すべてのメッセージを厳密な順序で処理する必要がある場合は、すべてのメッセージに同じメッセージグループ ID を使用します。

メッセージの受信

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

  1. バッチの取得

    • 複数のメッセージグループ ID を持つ FIFO キューからメッセージを受信する場合、Amazon SQS は以下のように動作します。

      • 1 回の呼び出しで、同じメッセージグループ ID を持つメッセージをできるだけ多く返そうとする。

      • 他のコンシューマーが、異なるメッセージグループ ID のメッセージを同時に処理できるようにする。

    • 重要な明確化

      • 同じメッセージグループ ID の複数のメッセージを、1 つのバッチで受信することがあります (MaxNumberOfMessages パラメータでは 1 回の呼び出しで最大 10 個のメッセージ)。

      • ただし、後続のリクエストでは、次の条件が満たされるまで、同じメッセージグループ ID から追加のメッセージを受信することはできません。

        • 現在受信されているメッセージが削除される、または

        • それらが再び表示される (可視性タイムアウトの有効期限が切れた後など)。

  2. FIFO 順序の保証

    • バッチで取得されたメッセージは、FIFO 順序をグループ内で保持します。

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

  3. コンシューマーの制限

    • 特定のメッセージグループ ID からメッセージを受信するように明示的にリクエストすることはできません。

複数回の再試行

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

  1. プロデューサーの再試行

    • SendMessage アクションが失敗した場合、プロデューサーは同じメッセージ重複排除 ID を使用してメッセージの送信を複数回再試行できます。

    • 重複排除間隔の期限が切れる前に、プロデューサーが少なくとも 1 つの確認を受け取る限り、再試行によって以下は発生しません。

      • 重複したメッセージの導入。

      • メッセージの順序の中断。

  2. コンシューマーの再試行

    • ReceiveMessage アクションが失敗しても、コンシューマーは同じ受信リクエスト試行 ID を使用して、必要な回数だけ再試行できます。

    • 可視性タイムアウトの期限が切れる前に、コンシューマーが少なくとも 1 つの確認を受け取る限り、再試行によって以下は発生しません。

      • メッセージの順序の中断。

FIFO 動作に関するその他の注意事項

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

  1. 可視性タイムアウトの処理

    • メッセージは取得されても削除されていない場合、可視性タイムアウトの有効期限が切れるまで表示されません。

    • 最初のメッセージが削除されるか、再び表示されるまで、同じメッセージグループ ID からの追加のメッセージは返されません。

  2. 同時実行処理と並列処理

    • FIFO キューでは、異なるメッセージグループ ID 間でメッセージを並列処理できます。

    • 同時実行性を最大化するには、独立したワークフローに対複数のメッセージグループ ID を使ってシステムを設計します。

  3. 単一グループのシナリオ

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

理解を深めるための例

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

  1. シナリオ 1: 単一グループ ID

    • プロデューサーが同じメッセージグループ ID グループ A を持つ 5 つのメッセージを送信します。

    • コンシューマーがこれらのメッセージを FIFO 順に受信します。コンシューマーがこれらのメッセージを削除するか、可視性タイムアウトの有効期限が切れるまで、グループ A から追加のメッセージは受信されません。

  2. シナリオ 2: 複数のグループ ID

    • プロデューサーがグループ A に 5 つのメッセージを送信し、グループ B に 5 つのメッセージを送信します。

    • コンシューマー 1 がグループ A からのメッセージを処理し、コンシューマー 2 はグループ B からのメッセージを処理します。これにより、厳密に順序通りに各グループ内での並列処理が可能になります。

  3. シナリオ 3: バッチの取得

    • プロデューサーがグループ A に 7 つのメッセージを送信し、グループ B に 3 つのメッセージを送信します。

    • 1 つのコンシューマーが最大 10 個のメッセージを取得します。キューが許可する場合、以下を返すことがあります。

      • グループ A から 7 件、グループ B から 3 件 (または単一グループからの利用可能なメッセージがそれ未満の場合はその数)。