あるメディア企業が、DynamoDB Streamsを使ってコンテンツ変更イベントを別システムに連携している。Lambdaがストリームを処理するが、まれにLambdaの処理がタイムアウトし、同じレコードが繰り返し再処理される問題が発生している。処理の冪等性(同じレコードを複数回処理しても結果が変わらないこと)を確保しながら、無限ループを防ぐ最も適切な方法はどれか。
- A. DynamoDB StreamsをKinesis Data Streamsに変換し、拡張ファンアウトで複数コンシューマーに並列配信する
- B. 処理済みレコードのsequenceNumberをDynamoDBの別テーブルに保存し、Lambda実行時に確認してスキップする。さらにイベントソースマッピングのbisectOnFunctionErrorを有効にしてバッチを二分して再試行する
- C. Lambdaの同時実行数を1に制限し、前のバッチが完了するまで次のバッチを処理しない
- D. Lambdaのタイムアウト値をDynamoDB Streamsのシャードイテレータ有効期限(24時間)より短く設定する
解答と解説を見る
正解: B
冪等性の確保にはprocessed sequenceNumberを外部(DynamoDB別テーブル等)に記録し、既処理レコードをスキップする手法が標準的である。加えてbisectOnFunctionErrorを有効にすると、バッチ内の特定レコードが原因でタイムアウトが発生した場合にバッチを二分して再試行することで、問題レコードを特定しDLQに隔離できる。これにより無限ループを防ぎつつ冪等処理を実現できる。Cの同時実行数1はスループットを大幅に低下させ、ストリームのレイテンシが増大するため本番環境では実用的でない。DのLambdaタイムアウト設定はストリームイテレータの有効期限とは無関係であり、タイムアウトしたレコードが繰り返し処理される問題は解決しない。Aへの変換はアーキテクチャの大改修が必要で、冪等性の問題を根本的には解決しない。
📚 関連サービスの解説: Amazon DynamoDB ・ AWS Lambda