無限ノック › DVA 練習問題一覧 › 問題
DVAAWSのサービスを使用した開発

Lambda関数がSQS標準キューからメッセージをポーリングして処理しています。キューのVisibilityTimeout(可視性タイムアウト)は30秒に設定されていますが、Lambda関数のタイムアウトは60秒です。一部のメッセージで処理に60秒近くかかった後に正常完了しているにもかかわらず、同じメッセージが複数回処理されてしまいます。この問題の根本原因と最善の解決策はどれですか?

A
Lambda関数の同時実行数が上限に達しているため、Lambda関数の予約済み同時実行数(Reserved Concurrency)を増やす
Lambda関数の予約済み同時実行数(Reserved Concurrency)は並行して実行できるインスタンス数を制限する設定であり、VisibilityTimeoutの設定ミスが原因の重複処理問題とは直接関係ありません。同時実行上限に達した場合はスロットリングエラーが発生しますが、メッセージの重複受信は起きません。
B
SQSキューのVisibilityTimeoutがLambdaのタイムアウトより短いため、VisibilityTimeoutをLambdaタイムアウトの6倍以上(360秒以上)に変更する
✓ 正解
SQSのVisibilityTimeoutがLambdaのタイムアウトより短いと、処理が完了する前にメッセージが再び他のコンシューマーから見える状態になり、別のLambdaインスタンスが同じメッセージを受信します。AWSはVisibilityTimeoutをLambdaタイムアウトの6倍以上(この場合360秒以上)に設定することを推奨しています。
C
SQS標準キューはメッセージの重複配信が保証されているため、SQS FIFOキューに移行して重複を防ぐ
SQS FIFOキューはexactly-once処理を提供しますが、これは根本原因(VisibilityTimeoutがLambdaタイムアウトより短い設定)を修正せずに問題を回避するだけです。また標準キューと比べてスループット制限(最大300TPS)も伴います。
D
Lambdaのバッチサイズが大きすぎるため、SQSトリガーのBatchSizeを1に設定する
BatchSizeを1に設定すると1回のLambda呼び出しで処理するメッセージ数は減りますが、VisibilityTimeoutとLambdaタイムアウトの関係は変わりません。タイムアウト超過による重複処理の根本原因は解決されません。

解説

SQSのVisibilityTimeoutは、メッセージ受信後に他のコンシューマーからそのメッセージが見えなくなる時間です。Lambdaタイムアウト(60秒)がVisibilityTimeout(30秒)を超えると、処理完了前にメッセージが再び可視化され、別のLambdaインスタンスが同じメッセージを受信します。AWSベストプラクティスではVisibilityTimeoutをLambdaタイムアウトの6倍以上(この場合は360秒以上)に設定することを推奨しています。 選択肢Aの予約済み同時実行数は並列処理数を制御するものであり、VisibilityTimeout設定が原因の重複処理とは無関係です。 選択肢CのFIFOキューへの移行はexactly-once処理を提供しますが、根本原因を修正せずに問題を回避するだけで、スループット制限も生じます。 選択肢DのBatchSize=1は1回のInvocationあたりのメッセージ数を減らすだけで、VisibilityTimeout設定の問題は解決しません。

ドメイン別正答率・予想スコアでリアルタイムに実力把握

無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。

無料で演習を始める →
← DVA の問題一覧に戻る