Amazon SQS キュー内のメッセージのバックログの増加を防ぐにはどうすればよいですか?

最終更新日: 2021 年 8 月 26 日

私の Amazon Simple Queue Service (Amazon SQS) キュー内のメッセージのバックログが増加しています。なぜこれが起こるのですか、またバックログが増加するのを防ぐにはどうすればよいですか?

簡単な説明

標準キューと FIFO SQS キュー

次の状況では、メッセージのバックログが増加します。

  • プロデューサーが、メッセージが消費されるよりも速い速度でメッセージを送信します。
  • コンシューマーは、可視性タイムアウト期間内にメッセージを削除しません。SQS キューがポーリングされると、メッセージがキューに再表示されます。

FIFO SQS キュー

FIFO (先入れ先出し) SQS キューの場合、メッセージのバックログの増加は、次のいずれかによっても発生する可能性があります。

  • FIFO キュー 20,000 メッセージバッファの上限。
  • あるメッセージグループに属するメッセージがコンシューマーでスタックされ、同じメッセージグループからの他のメッセージが処理されなくなります。

解決方法

メッセージのバックログが増加しないようにするには、次のベストプラクティスに従ってください。

標準キューと FIFO SQS キュー

  • SQS キューの最適可視性タイムアウトを設定して、コンシューマーが可視性タイムアウト期間内にメッセージを処理した後にメッセージを削除できるようにします。メッセージの処理にかかる時間がわからない場合は、コンシューマープロセスのハートビートを作成します。初期可視性タイムアウト (2 分など) を指定します。その後、コンシューマーがメッセージの処理にさらに時間を必要とする場合は、changeMessageVisibility API コールを使用して可視性タイムアウトを引き続き増やします。
  • ReceiveMessage API コールを行うときにバッチサイズを増やします。MaxNumberOfMessages パラメータの値を 1 より多く、最大 10 で設定します。
  • SQS キューメトリクスの可視メッセージの概算値を監視します。このメトリクスを使用すると、コンシューマーがメッセージを消費できるよりも高いレートでプロデューサーがメッセージの生成を開始しているかどうかを確認できます。水平方向にスケーリングするには、SQS キューを消費するコンシューマーまたはクライアントの数を増やすか、キューをポーリングするスレッドの数を増やします。

FIFO SQS キュー

20,000 メッセージバッファ

FIFO キューでは、最大 20,000 個の処理中メッセージを許可します。処理中メッセージには、コンシューマーがキューから受信したけれども、キューからはまだ削除されていないメッセージが含まれます。20,000 クォータに達した場合、Amazon SQS はエラーメッセージを返しません。FIFO キューは、最初の 20,000 個のメッセージを調べ、使用可能なメッセージグループを判別します。1 つのメッセージグループにメッセージのバックログがある場合、バックログからのメッセージを正常に消費するまで、他のメッセージグループからのメッセージを消費することはできません。

メッセージグループのスケーリング

同じメッセージグループに属するメッセージは、そのメッセージグループに関連した順序で 1 つずつ処理されます。複数のメッセージグループ ID を持つメッセージを受信すると、Amazon SQS は最初に同じメッセージグループ ID を持つメッセージをできる限り多く返そうとします。これにより、他のコンシューマーが別のメッセージグループ ID を持つメッセージを処理できるようになります。特定のメッセージグループ ID に属するメッセージの可視性がない場合、他のコンシューマーは同じメッセージグループ ID を持つメッセージを処理できません。ただし、コンシューマーは他のメッセージグループからのメッセージを処理できます。順序が重要でないメッセージグループの数を増やしてみてください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?