無限ノック › SAP 練習問題一覧 › 問題
SAP新しいソリューションのための設計

あるフィンテック企業は、決済リクエストを処理するイベント駆動アーキテクチャを構築しています。クライアントからのリクエストはAPI Gateway経由でAWS Lambdaに渡され、Lambdaが外部決済プロバイダを呼び出して顧客に課金します。ネットワークタイムアウトやクライアントの再試行、少なくとも1回配信の性質により、同一の決済リクエストが数分以上の間隔をあけて再送されるケースが観測され、まれに二重課金が発生しています。要件は、同一リクエストに対する課金という副作用を確実に一度だけ実行し、顧客単位の処理順序も維持することです。最も適切な設計はどれですか。

A
Amazon SQS FIFOキューを使用し、メッセージグループIDで顧客単位の順序を保証し、コンテンツベースの重複排除機能で同一メッセージの二重処理を防止してLambdaで課金処理を実行する
SQS FIFOのコンテンツベース重複排除は排除IDの有効期間が5分間に限られるため、数分以上の間隔をあけて再送される決済リクエストの重複を検出できず、二重課金を根本的に防止できない。
B
リクエストごとの冪等性キーをDynamoDBに条件付き書き込み(attribute_not_exists)で登録し、処理済みなら副作用をスキップすることで、再送されても課金が一度だけ実行される仕組みにする
✓ 正解
冪等性キーの条件付き書き込みはアトミックで、キー存在時に書き込みが失敗するため副作用をスキップでき、再送の時間間隔に関係なく課金を確実に一度だけに保てる。順序は属性で担保でき要件に合致する。
C
AWS Step FunctionsのStandardワークフローで処理をオーケストレーションし、実行名にトランザクションIDを指定して重複実行を防止し、失敗ステップはCatchとRetryで補償トランザクションを実行して整合性を保つ
Step Functionsの実行名重複防止は起動の重複は抑止できるが、外部決済呼び出しのリトライで生じる重複には別途冪等性制御が必要で、順序保証の本質的解決にもならず過剰設計となる。
D
Amazon Kinesis Data Streamsでシャードごとに順序を保証し、Lambdaのバッチ処理でチェックポイントを進めることで、コンシューマの再起動時にも重複した課金処理を回避する構成にする
Kinesisはチェックポイント確定前にコンシューマが障害を起こすとレコードが再処理されるため、少なくとも1回配信となり、それ自体では課金の副作用を正確に一度だけ実行することを保証できない。

解説

冪等性キー(トランザクションID等)をDynamoDBに条件付き書き込み(attribute_not_exists)で登録する方式は、キーが既に存在すれば書き込みが失敗するため課金の副作用をスキップでき、再送が何分・何時間後であっても副作用を確実に一度だけに保てます。 条件付き書き込みはアトミックで、任意の時間幅の重複を検出できるため、決済のような正確に一度の副作用が求められるケースに最適です。ソート順は別途メッセージ属性やストリームで担保します。 選択肢AのSQS FIFOの重複排除は排除IDの有効期間が5分間に限定されるため、数分以上あけた再送では重複を検出できず二重課金を防げない。 選択肢CのStep Functionsの実行名による重複防止は制御が可能だが、外部決済呼び出し自体の再試行での重複には冪等性制御が別途必要で、順序保証も本質的な解ではない。 選択肢DのKinesisはチェックポイント前の障害でレコードが再処理されるため、それ自体では副作用の一度きり実行を保証できない。

ドメイン別正答率・予想スコアでリアルタイムに実力把握

無限ノックでSAPを徹底対策。全問AI生成のオリジナル問題。

無料で演習を始める →
← SAP の問題一覧に戻る