Eコマースアプリケーションでは、SQSキューを介してLambda関数で支払いトランザクションを処理しています。Lambda関数のタイムアウトは300秒(5分)に設定されており、SQSの可視性タイムアウト(Visibility Timeout:処理中のメッセージを他のコンシューマーから隠す時間)は60秒に設定されています。一部の支払いが重複処理されて二重請求が発生しています。この問題の根本原因はどれですか?
可視性タイムアウトがLambda関数のタイムアウトより短い場合、処理中にメッセージが再度キューに露出し、別のLambdaインスタンスによる重複取得が発生します。AWSのベストプラクティスでは可視性タイムアウトをLambda関数タイムアウトの6倍以上(本ケースでは最低1,800秒)に設定することを推奨しています。 選択肢AのSQS標準キューはAt-Least-Once配信(少なくとも1回の配信を保証する仕組み)のため重複は不可避であり、FIFOキューへの切り替えが必要ですが、根本原因である可視性タイムアウトの不足を修正しておらず、スループット上限(1秒あたり300件)の制約も生じます。 選択肢CのLambda関数がメッセージ処理完了後にSQSキューからメッセージを明示的に削除していないというのは誤りです。SQSトリガーのLambdaは処理成功後に自動でメッセージを削除します。 選択肢DのLambda関数の予約済み同時実行数(Reserved Concurrency)が不足しているというのは、可視性タイムアウト起因の重複処理を防ぐ仕組みではありません。