Amazon SQS の FIFO キュー配信ロジック
以下の概念では、Amazon SQS FIFO キューがメッセージの送受信を処理する方法、特にメッセージの順序付けとメッセージグループ ID を処理する方法について説明します。
メッセージの送信
Amazon SQS FIFO キューは、一意の重複排除 ID とメッセージグループ ID を使用してメッセージの順序を維持します。このトピックでは、グループ内で厳密な順序を維持するためのメッセージグループ ID の重要性と、複数のプロデューサー間で信頼性が高く順序付けられたメッセージ配信を確保するためのベストプラクティスについて説明します。
-
順序の保存
-
複数のメッセージが一意のメッセージ重複排除 ID とともに FIFO キューへ連続して送信されると、Amazon SQS はそれらを保存し、その送信を確認します。その後、これらのメッセージは、その送信順序どおりに正確に受信して処理されます。
-
-
メッセージグループ ID
-
FIFO キューでは、メッセージはメッセージグループ ID に基づいて順序付けられます。複数のプロデューサーまたはスレッドが同じメッセージグループ ID でメッセージを送信する場合、Amazon SQS はそれらが到着した順序で保存および処理されるようにします。
-
ベストプラクティス: 複数のプロデューサー間で厳密なメッセージ順序を保証するため、各プロデューサーからのすべてのメッセージに一意のメッセージグループ ID を割り当てます。
-
-
グループごとの順序付け
-
FIFO キューロジックはメッセージグループ ID ごとにのみ適用されます:
-
各メッセージグループ ID は、メッセージの異なる順序付けされたグループを表します。
-
メッセージグループ ID 内で、すべてのメッセージが厳密な順序で送受信されます。
-
メッセージグループ ID が異なるメッセージは、互いに順序どおりに到着または処理されない場合があります。
-
-
要件 - メッセージグループ ID を各メッセージに関連付ける必要があります。グループ ID なしでメッセージを送信すると、アクションは失敗します。
-
単一グループのシナリオ - すべてのメッセージを厳密な順序で処理する必要がある場合は、すべてのメッセージに同じメッセージグループ ID を使用します。
-
メッセージの受信
Amazon SQS の FIFO キューは、バッチ処理、FIFO 順序の保証、および特定のメッセージグループ ID をリクエストする際の制限を含め、メッセージの取得を処理します。このトピックでは、Amazon SQS が厳密な順序および可視性ルールを維持しながら、メッセージグループ ID 内およびそれらの間でメッセージを取得する方法について説明します。
-
バッチの取得
-
複数のメッセージグループ ID を持つ FIFO キューからメッセージを受信する場合、Amazon SQS は以下のように動作します。
-
1 回の呼び出しで、同じメッセージグループ ID を持つメッセージをできるだけ多く返そうとする。
-
他のコンシューマーが、異なるメッセージグループ ID のメッセージを同時に処理できるようにする。
-
-
重要な明確化
-
同じメッセージグループ ID の複数のメッセージを、1 つのバッチで受信することがあります (
MaxNumberOfMessagesパラメータでは 1 回の呼び出しで最大 10 個のメッセージ)。 -
ただし、後続のリクエストでは、次の条件が満たされるまで、同じメッセージグループ ID から追加のメッセージを受信することはできません。
-
現在受信されているメッセージが削除される、または
-
それらが再び表示される (可視性タイムアウトの有効期限が切れた後など)。
-
-
-
-
FIFO 順序の保証
-
バッチで取得されたメッセージは、FIFO 順序をグループ内で保持します。
-
同じメッセージグループ ID で使用できるメッセージが 10 件未満の場合、Amazon SQS は同じバッチ内の他のメッセージグループ ID からのメッセージを含めることができますが、各グループは FIFO 順序を保持します。
-
-
コンシューマーの制限
-
特定のメッセージグループ ID からメッセージを受信するように明示的にリクエストすることはできません。
-
複数回の再試行
Amazon SQS の FIFO キューでは、プロデューサーやコンシューマーが失敗した操作を、メッセージの順序を乱したり重複を生じさせることなく、安全に再試行できます。このトピックでは、重複排除 ID と可視性タイムアウトにより、再試行時にメッセージの整合性がどのように確保されるかについて説明します。
-
プロデューサーの再試行
-
SendMessageアクションが失敗した場合、プロデューサーは同じメッセージ重複排除 ID を使用してメッセージの送信を複数回再試行できます。 -
重複排除間隔の期限が切れる前に、プロデューサーが少なくとも 1 つの確認を受け取る限り、再試行によって以下は発生しません。
-
重複したメッセージの導入。
-
メッセージの順序の中断。
-
-
-
コンシューマーの再試行
-
ReceiveMessageアクションが失敗しても、コンシューマーは同じ受信リクエスト試行 ID を使用して、必要な回数だけ再試行できます。 -
可視性タイムアウトの期限が切れる前に、コンシューマーが少なくとも 1 つの確認を受け取る限り、再試行によって以下は発生しません。
-
メッセージの順序の中断。
-
-
FIFO 動作に関するその他の注意事項
可視性タイムアウトの管理、複数のメッセージグループ ID を使った並列処理の有効化、単一グループでの厳密な順序処理の確保について説明します。
-
可視性タイムアウトの処理
-
メッセージは取得されても削除されていない場合、可視性タイムアウトの有効期限が切れるまで表示されません。
-
最初のメッセージが削除されるか、再び表示されるまで、同じメッセージグループ ID からの追加のメッセージは返されません。
-
-
同時実行処理と並列処理
-
FIFO キューでは、異なるメッセージグループ ID 間でメッセージを並列処理できます。
-
同時実行性を最大化するには、独立したワークフローに対複数のメッセージグループ ID を使ってシステムを設計します。
-
-
単一グループのシナリオ
-
FIFO キュー内のすべてのメッセージを厳密に順序通り処理するには、キュー内のすべてのメッセージに対して単一のメッセージグループ ID を使用します。
-
理解を深めるための例
以下は、Amazon SQS での FIFO キューの動作を説明する実用的なシナリオです。
-
シナリオ 1: 単一グループ ID
-
プロデューサーが同じメッセージグループ ID グループ A を持つ 5 つのメッセージを送信します。
-
コンシューマーがこれらのメッセージを FIFO 順に受信します。コンシューマーがこれらのメッセージを削除するか、可視性タイムアウトの有効期限が切れるまで、グループ A から追加のメッセージは受信されません。
-
-
シナリオ 2: 複数のグループ ID
-
プロデューサーがグループ A に 5 つのメッセージを送信し、グループ B に 5 つのメッセージを送信します。
-
コンシューマー 1 がグループ A からのメッセージを処理し、コンシューマー 2 はグループ B からのメッセージを処理します。これにより、厳密に順序通りに各グループ内での並列処理が可能になります。
-
-
シナリオ 3: バッチの取得
-
プロデューサーがグループ A に 7 つのメッセージを送信し、グループ B に 3 つのメッセージを送信します。
-
1 つのコンシューマーが最大 10 個のメッセージを取得します。キューが許可する場合、以下を返すことがあります。
-
グループ A から 7 件、グループ B から 3 件 (または単一グループからの利用可能なメッセージがそれ未満の場合はその数)。
-
-