Amazon SQS FIFO キューから、一部のメッセージまたは他のメッセージグループのメッセージが返されない理由を知りたいです。

所要時間2分
0

ReceiveMessage API を呼び出すと、Amazon Simple Queue Service (Amazon SQS) の先入れ先出し (FIFO) キューから一部のメッセージが返されません。

解決策

FIFO キューを使用する場合、特定のメッセージグループ ID からのメッセージの受信をリクエストすることはできません。また、ReceiveMessage API 呼び出しをフィルタリングして、一度に 1 つのメッセージグループ内のメッセージのみを返すこともできません。

ReceiveMessage API コールで MaxNumberOfMessages パラメータを指定すると、SQS は同じメッセージグループ ID を持つメッセージをできる限り多く返します。ReceiveMessage API 呼び出しでは、他の利用可能なメッセージグループからのメッセージを返すこともできます。

FIFO キューの場合、特定のメッセージグループ ID に属するメッセージを受信する際は、次のガイドラインに注意してください。

  • 同じメッセージグループ ID からさらにメッセージを受信するには、現在のメッセージグループ ID のメッセージを削除する必要があります。
  • メッセージが受信されたが、まだ削除が行われていない場合、処理中の状態になります。処理中のメッセージは、同じメッセージグループ内の利用可能なメッセージの配信をブロックします。
  • メッセージが処理中の状態になる一般的な理由は、コンシューマークライアントにより予期せぬ障害が起こるためです。他の理由としては、ダウンストリームの AWS Lambda のコンシューマー関数で例外が発生した、または同時実行数が最大に達したなどが挙げられます。
  • ChangeMessageVisibility API は、処理中のメッセージの可視性タイムアウト期間を延長または短縮できます。
  • メッセージの可視性タイムアウト期間が終了するまで待ち、メッセージを再配信することができます。

すべての FIFO キューと Amazon SQS のクォータ制限については、次のガイドラインに注意してください。

  • FIFO キューには最大 120,000 件のインフライトメッセージを含めることができます。

    注: Amazon SQS では、クォータ制限を超えるエラーメッセージが返されることはありません。

  • FIFO キューは、高スループットを有効にしなくても最大 300 トランザクション/秒 (TPS) の処理が可能です。TPS が 300 を超えるリクエストでは、キュー内のメッセージが使用可能であっても「ThrottlingException」エラーが発生します。

  • SQS FIFO キューのメッセージは、パーティションに保存されます。各パーティションは、送信、受信、削除の操作で最大 300 TPS をサポートします。詳細については、「パーティション使用率の最適化」を参照してください。

  • 高スループットの FIFO キューでは、1 つのパーティションを複数のメッセージグループと共有できます。メッセージグループのパーティションで TPS が 300 を超えると、スロットリングのせいで、そのパーティションの他のグループからのメッセージは配信されません。

  • 高スループットの FIFO キューにおける 1 秒あたりのトランザクション数は、AWS リージョンによって異なります。詳細については、「Amazon SQS メッセージのクォータ」を参照してください。

FIFO キューで Amazon SQS のスループット制限を減らす際には、次のガイドラインに注意してください。

FIFO キューは最初の 120,000 件のメッセージを調べ、使用可能なメッセージグループを判別します。最初の 120,000 メッセージのメッセージグループがインフライトメッセージによりブロックされた場合、最初の 120,000 件を超えた他のグループからのメッセージは返されません。詳細については、「Amazon SQS で、同じメッセージグループ ID を持つ大規模なメッセージのバックログを回避する」を参照してください。

例 A

FIFO キューに合計 120,001 件のメッセージがあります。最初の 120,000 件のメッセージはメッセージグループ 1 に属し、最後のメッセージはメッセージグループ 2 に属しています。キューからメッセージを受信しようとすると、グループ 1 からのメッセージのみが受信されます。連続した ReceiveMessage API コールの受信結果は、空白となります。これは、FIFO がグループ 1 に属するメッセージのみを調べており、そのグループが現在の呼び出しによってブロックされているために発生します。

例 B

FIFO キューに合計 120,000 件のメッセージがあります。最初の 119,999 件のメッセージはメッセージグループ 1 に属し、最後のメッセージはメッセージグループ 2 に属しています。キューからメッセージを受信しようとすると、最初の ReceiveMessage 呼び出しはグループ 1 に属するメッセージを取得します。2 回目の ReceiveMessage 呼び出しは、グループ 2 に属するメッセージを取得します。両方のグループが現在の呼び出しによってブロックされるようになったため、追加の ReceiveMessage 呼び出しを行うと、受信する内容は空白となります。

関連情報

Amazon Simple Queue Service (Amazon SQS) キューを使用する

AWS公式
AWS公式更新しました 3ヶ月前
コメントはありません

関連するコンテンツ