Amazon SQS FIFO キューがすべてのメッセージまたは他のメッセージグループのメッセージを返すわけではないのはなぜですか?

所要時間2分
0

私の Amazon Simple Queue Service (Amazon SQS) 先入れ先出し (FIFO) キューが、ReceiveMessage API をコールしたときに一部のメッセージを返しません。

解決策

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

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

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

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

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

  • FIFO キューには最大 20,000 件の処理中のメッセージを含めることができます。
    注: Amazon SQS では、クォータ制限を超えるエラーメッセージが返されることはありません。
  • FIFO キューは、高スループットを有効にしなくても最大 300 トランザクション/秒 (TPS) の処理が可能です。TPS が 300 を超えるリクエストでは、キュー内のメッセージが使用可能であっても「ThrottlingException」エラーが発生します。
  • SQS FIFO キューのメッセージは、パーティションに保存されます。各パーティションは、送信、受信、削除の操作で最大 300 TPS をサポートします。詳細については、「パーティション使用率の最適化」を参照してください。
  • 高スループットの FIFO キューでは、1 つのパーティションを複数のメッセージグループと共有できます。メッセージグループのパーティションで TPS が 300 を超えると、スロットリングのせいで、そのパーティションの他のグループからのメッセージは配信されません。
  • 高スループットの FIFO キューにおける 1 秒あたりのトンザクション数は、AWS リージョンによって異なります。詳細については、「メッセージに関連するクォータ」を参照してください。

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

FIFO キューは最初の 20,000 件のメッセージを調べ、使用可能なメッセージグループを判別します。最初の 20,000 メッセージのすべてのメッセージグループが、処理中のメッセージが理由でブロックされた場合、最初の 20,000 の後の他のグループからのメッセージは返されません。詳細については、「同じメッセージグループ ID を持つメッセージの大きなバックログを回避する」を参照してください。

例 A

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

例 B

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

関連情報

Amazon SQS FIFO (先入れ先出し) キュー

Amazon SQS メッセージグループ ID の使用

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

関連するコンテンツ