ある企業が、Amazon SQS FIFO キューを使って注文処理システムを構築している。1 注文につき複数のメッセージが送信され、各注文のメッセージは順序通りに処理される必要がある。現在、Consumer の Lambda 関数が処理中にエラーが発生すると、同じメッセージが何度もリトライされ、後続の同一注文のメッセージ処理がブロックされる問題が発生している。最も適切な対処方法はどれか。
- A. Lambda 関数のエラーハンドリングを強化し、すべての例外を catch して常に SQS から正常に削除する。
- B. SQS FIFO キューの代わりに標準キュー(Standard Queue)に変更し、順序保証を諦めてスループットを優先する。
- C. 可視性タイムアウトを 0 に設定して失敗したメッセージをすぐに再キューし、高速リトライを実現する。
- D. FIFO キューの Message Group ID を注文 ID に設定しつつ、Lambda のイベントソースマッピングのレポートバッチアイテム失敗(reportBatchItemFailures)機能を有効化し、処理失敗したメッセージのみ SQS に返す。DLQ も設定する。
解答と解説を見る
正解: D
SQS FIFO キューで Message Group ID(注文 ID)を使うことで、同一注文のメッセージは順序通りに処理される。Lambda の reportBatchItemFailures 機能を有効にすると、バッチ処理内で失敗したメッセージのみを SQS に返して再試行でき、成功したメッセージは削除される。これにより失敗メッセージのブロッキング時間を最小化できる。DLQ を設定することで最大試行回数を超えたメッセージを保全できる。選択肢Bは順序保証を完全に失うため、注文処理の業務要件を満たさない。選択肢Cは可視性タイムアウト 0 で高速リトライすると、エラーが継続する場合に無限ループに陥り、後続メッセージを際限なくブロックする。選択肢Aはすべてのエラーをキャッチして正常削除するとエラーを握りつぶすことになり、処理失敗の検知・リトライ・DLQ への退避ができなくなりデータ損失リスクが高まる。
📚 関連サービスの解説: AWS Lambda ・ Amazon SQS