DVAトラブルシューティングと最適化
Lambda関数がSQSキューからメッセージを取得して処理しています。メッセージの処理は成功しているにもかかわらず、同じメッセージが複数回処理されています。
CloudWatchのログで確認すると、処理時間は平均45秒かかっています。
SQSキューの可視性タイムアウト(Visibility Timeout)は30秒に設定されています。
この問題を解決する最も適切な方法はどれですか?
ASQSキューの可視性タイムアウトをLambda関数のタイムアウト値以上(例:60秒以上)に延長する
✓ 正解
可視性タイムアウトは、メッセージが取得されてから他のコンシューマーに再び見えるようになるまでの時間です。処理時間(45秒)が可視性タイムアウト(30秒)を超えると、処理完了前にメッセージが再度キューに表示され、別のLambda実行が同じメッセージを取得します。可視性タイムアウトはLambda関数のタイムアウト値の6倍に設定することが推奨されています。
BSQSキューの受信待機時間(Receive Message Wait Time)を20秒に設定してロングポーリングを有効にする
ロングポーリングは、SQSへの接続待機時間を最適化する設定であり、可視性タイムアウトや重複処理の問題とは無関係です。
CLambda関数の同時実行数(Reserved Concurrency)を1に制限する
Reserved Concurrency を1に制限しても、可視性タイムアウトが切れてメッセージが再表示された後に同一インスタンスが再取得すれば重複処理は発生します。
DSQSキューにデッドレターキュー(DLQ)を設定し、最大受信数(maxReceiveCount)を1にする
デッドレターキュー(DLQ)はメッセージ処理に失敗した場合の退避先であり、この問題では処理自体は成功しているため根本的な解決になりません。
解説
選択肢AのSQSキューの可視性タイムアウトをLambda関数のタイムアウト値以上に延長する方法が正解です。可視性タイムアウトは、メッセージが取得されてから他のコンシューマーに再び見えるようになるまでの時間です。処理時間(45秒)が可視性タイムアウト(30秒)を超えると、処理完了前にメッセージが再度キューに表示され、別のLambda実行が同じメッセージを取得します。可視性タイムアウトはLambda関数のタイムアウト値の6倍に設定することが推奨されています。
選択肢Bのロングポーリングは、SQSへの接続待機時間を最適化する設定であり、可視性タイムアウトや重複処理の問題とは無関係です。
選択肢CのReserved Concurrencyを1に制限しても、可視性タイムアウトが切れてメッセージが再表示された後に同一インスタンスが再取得すれば重複処理は発生します。
選択肢Dのデッドレターキュー(DLQ)はメッセージ処理に失敗した場合の退避先であり、この問題では処理自体は成功しているため根本的な解決になりません。
ドメイン別正答率・予想スコアでリアルタイムに実力把握
無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。
無料で演習を始める →