ある企業が、Amazon DynamoDB を使ってリアルタイムの在庫管理システムを構築している。注文処理時に在庫数を減少させる操作が複数のアプリケーションから同時に実行され、在庫がマイナスになるオーバーセル問題が発生している。アプリケーションコードの変更を最小限にしてこの問題を解決したい。最も適切な方法はどれか。
- A. DynamoDB テーブルを RDS for PostgreSQL に移行し、SELECT FOR UPDATE でトランザクション制御を行う。
- B. DynamoDB の条件付き書き込み(ConditionExpression)を使い、在庫数が減少後も 0 以上であることを条件とした UpdateItem を実行する。条件が満たされない場合は ConditionalCheckFailedException が発生し、クライアントがリトライ時に在庫不足と判断できる。
- C. 在庫テーブルの読み取りキャパシティを増やして読み取り速度を向上させる。
- D. Amazon SQS FIFO キューを使って注文リクエストを順番に処理し、同時処理をシリアル化する。
解答と解説を見る
正解: B
DynamoDB の条件付き書き込みはオプティミスティック同時実行制御の標準パターンである。UpdateItem の ConditionExpression に「inventory_count >= :decrement_amount」(デクリメント量以上の在庫がある場合のみ更新)を設定することで、在庫がマイナスになる更新をアトミックに防止できる。複数の同時リクエストがあっても DynamoDB が原子性を保証する。コード変更は UpdateItem の ConditionExpression 追加のみで最小限。選択肢Cの読み取りキャパシティ増加はオーバーセル問題の解決にならない。問題は同時書き込みの競合であり、読み取り速度とは無関係。選択肢DのSQS FIFO によるシリアル化は確実だが、コスト・レイテンシーが増加し、高スループットの注文処理では SQS FIFO の TPS 上限が問題になる可能性がある。選択肢AのRDS 移行は大規模なアーキテクチャ変更が必要で、「コード変更最小限」要件に反する。
📚 関連サービスの解説: Amazon DynamoDB