Amazon Simple Queue Service (Amazon SQS) キューのメッセージのバックログが増えたので、増加を防ぎたいです。
簡単な説明
スタンダードキューと FIFO SQS キュー
メッセージのバックログは、次の状況で増加します。
- プロデューサーが、メッセージが消費されるよりも速い速度でメッセージを送信している。
- コンシューマーが、可視性のタイムアウト期間内にメッセージを削除していない。SQS キューがポーリングされるときに、メッセージがキューに再度追加されている。
FIFO SQS キュー
FIFO (First-In-First-Out) SQS キューでは、次のいずれかの理由でメッセージのバックログが増える場合もあります。
- FIFO キューのメッセージバッファ制限 (120,000 件)。
- メッセージグループに属するメッセージが、同じメッセージグループの他のメッセージの処理を妨げるコンシューマーによりスタック状態になっている。
解決策
メッセージのバックログ増加を防ぐには、以下のベストプラクティスに従ってください。
スタンダードキューと FIFO SQS キュー
- SQS キューに最適な可視性タイムアウトを設定することで、コンシューマーが可視性タイムアウト期間内にメッセージを処理した後にメッセージを削除できるようにします。メッセージの処理にかかる時間がわからない場合は、コンシューマープロセスのハートビートを作成してください。初回の可視性タイムアウト (たとえば、2 分) を指定します。コンシューマーがメッセージを処理するのにより多くの時間が必要な場合は、ChangeMessageVisibility API コールを使用して可視性タイムアウトを増やします。
- ReceiveMessage API コールを行う場合は、バッチサイズを増やします。MaxNumberOfMessages パラメーターの値を 1 より大きい、10 以内の値に設定します。
- SQS キューメトリクスで表示されるメッセージのおおよその数を監視します。このメトリクスでは、プロデューサーがコンシューマーがメッセージを使用できるレートよりも高いレートでメッセージを生成するようになっているかどうかを確認できます。水平方向にスケーリングするには、SQS キューを使用するコンシューマーまたはクライアントの数を増やすか、キューをポーリングするスレッドの数を増やします。
FIFO SQS キュー
120,000 メッセージのバッファ
FIFO キューでは、最大 120,000 件のインフライトメッセージが許容されます。インフライトメッセージには、コンシューマーがキューから受信したが、まだそのキューから削除されていないメッセージが含まれます。120,000 件のクォータに達しても、Amazon SQS はエラーメッセージを返しません。
FIFO キューは最初の 120,000 件のメッセージをレビューし、使用可能なメッセージグループを判断します。単一のメッセージグループにメッセージのバックログがある場合、そのバックログのメッセージを正常に処理するまで、他のメッセージグループのメッセージを消費することはできません。
メッセージグループのスケールオーバー
同じメッセージグループに属するメッセージは、メッセージグループに対応する順序で 1 件ずつ処理されます。複数のメッセージグループ ID を持つメッセージを受信する場合、Amazon SQS は同じメッセージグループ ID を持つメッセージをできるだけ多く返そうとします。これにより、他のコンシューマーは別のメッセージグループ ID のメッセージを処理できます。
特定のメッセージグループ ID に属するメッセージが不可視である場合、他のコンシューマーは同じメッセージグループ ID を持つメッセージを処理できません。ただし、コンシューマーは他のメッセージグループからのメッセージを処理することはできます。順序が問題とはならないメッセージグループの数を増やしてみてください。