DVA-C02開発HARD単一選択

ある企業がAPI GatewayのREST APIとLambda関数を使ってポイント付与APIを運用している。このAPIは同一ユーザーへの同一トランザクションIDによる呼び出しが複数回来ることがあり、現在は二重付与が発生している。DynamoDBを使ってAPIのべき等性を担保したい。最も確実にべき等性を実現する実装方針として適切なものはどれか。

  1. A. API GatewayのキャッシュにtransactionIdをキャッシュキーとして設定し、同一IDのレスポンスをキャッシュから返す
  2. B. DynamoDBのバッチ書き込み(BatchWriteItem)でtransactionIdを一括登録し、重複エントリを事前に検出する
  3. C. Lambda関数に予約済み同時実行数=1を設定して同時実行を防ぎ、重複リクエストの同時処理を回避する
  4. D. DynamoDBの条件付き書き込み(ConditionExpression)を使い、transactionIdを主キーとして既に存在する場合は書き込みを失敗させる
解答と解説を見る

正解: D

DynamoDBの条件付き書き込みを使い「attribute_not_exists(transactionId)」という条件式を設定すると、同じtransactionIdを主キーとするアイテムが既に存在する場合はConditionalCheckFailedExceptionがスローされて書き込みが原子的に失敗する。この動作がべき等性の核心であり、競合状態(レースコンディション)が発生しても安全である点が重要である。最初の成功したリクエストだけがポイント付与と記録を行い、後続の重複リクエストは例外を検知してスキップまたはキャッシュ済みの成功レスポンスを返す。選択肢BのBatchWriteItemは複数アイテムを一括書き込みするAPIであり、「重複があった場合に書き込みを拒否する」機能は持っていない。また、バッチ書き込み後に重複を検出するアプローチは競合状態に脆弱である。選択肢CのReserved Concurrency=1は同時実行を1に制限するが、時間をずらした順次リクエストの重複処理は防げず、スループットも極端に制限されてしまう。選択肢AのAPI Gatewayキャッシュはレスポンスを一時的にキャッシュするが、最初のリクエストが処理中の間に2回目のリクエストが来るとキャッシュがなくバックエンドに転送されるため、競合状態でのべき等性を保証できない。

▸ この試験を本気で演習する(全150問・無料)