WEB問題集
ある EC 事業者は、注文の作成・変更・取り消しのイベントを Lambda 関数で処理し、在庫の引き当てを行っています。今はオンプレミスのメッセージブローカーから 1 つのコンシューマーが全件を順番に処理しており、セールの間は数十分の遅れが出ています。同じ注文のイベントが前後すると在庫の数が狂い、同じイベントを 2 回処理すると在庫が二重に引き当てられます。一方で、別々の注文のイベントは並行して処理しても問題ありません。ピーク時の流量は毎秒 3,000 件ほどです。
注文ごとの処理順と重複の排除を保ちながら、異なる注文を並行して処理できる構成はどれですか。
解説
【正解: D】の理由
決め手はメッセージグループ ID の使い方です。この ID の中で、FIFO キューは送信の順序を保ち、重複を取り込まずに 1 回だけ処理します。そのため注文 ID をグループ ID にすれば、注文ごとの順序が守られ、別の注文は別グループとして並行に処理されます。さらに高スループットモードはその値で複数のパーティションに分けるので、毎秒 3,000 件にも合います。
【他選択肢が違う理由】
- A: 標準キューは順序を保証しません。また、同じメッセージが 2 回届くこともあり、二重の引き当てが起きます。
- B: SNS 標準トピックは順序を保証しません。また、フィルターポリシーは配信先を選ぶだけで、重複も除けません。
- C: ルールは配信の順序を保証しません。また、デッドレターキューでは重複したイベントを取り除けません。
【参考】
AWS Docs: Amazon SQS FIFO キュー
AWS Docs: Amazon SQS の FIFO キューの高スループット
ある小売企業は、受注システムが出す注文イベントを、請求・配送・ポイントの 3 つのシステムに配る仕組みを AWS で作り直しています。イベントは 1 日に約 2 万件で、種類は注文の確定・取り消し・返品の 3 つです。請求システムはすべての種類を、配送システムは確定と取り消しを、ポイントシステムは確定と返品を処理します。各システムには、自分に関係のない種類のイベントを届けないことが求められています。処理の順序は問われず、各システムは同じイベントを 2 回受け取っても結果が変わらない作りです。今はオンプレミスのサーバーで動く自作の配信プログラムを使っています。
最も費用対効果の高い方法でこの配信を実現する構成はどれですか。
解説
【正解: A】の理由
決め手は、絞り込みと料金です。まず、SNS のサブスクリプションにフィルターポリシーを付けると、条件に合うメッセージだけが各キューに届き、関係のない種類は届きません。また、SNS と SQS は使った分だけの料金で、1 日 2 万件なら常に動くブローカーやシャードの時間料金がかかりません。さらに順序を問わず冪等な処理なので、標準のトピックとキューで足ります。
【他選択肢が違う理由】
- B: 拡張ファンアウトは全レコードを各コンシューマーに送り、不要な種類も届きます。また、シャードの料金もかかります。
- C: MSK のブローカーは流量によらず常に動き、時間単位の料金がかかります。これは 1 日 2 万件には見合いません。
- D: 1 つのキューのメッセージは 1 つのシステムだけが処理します。そのため、ほかの 2 つには届きません。
【参考】
AWS Docs: Amazon SNS メッセージフィルター処理
AWS Docs: 専用スループットを備えた拡張ファンアウトを開発する
ある決済代行会社は、EventBridge のカスタムイベントバスで受けた支払い確定のイベントを、ルールから Lambda 関数に送って加盟店への入金指示を作っています。加盟店は約 8,000 社で、イベントは 1 日に約 50 万件あります。関数の非同期呼び出しの設定は既定のままで、失敗時の送信先は設定されていません。
監査の結果、同じイベントが 2 回処理されて入金指示が重複した事例が見つかりました。また、関数の障害が 1 日以上続いた際に、再試行を使い切ったイベントが失われていました。障害の間も EventBridge から関数への呼び出しは受け付けられており、エラーは関数の処理の中で起きていました。入金指示を作る処理は Lambda 関数のまま変えない方針です。さらに、不正検知などのコンシューマーを今後追加するときは、過去 30 日分のイベントをそのコンシューマーにだけ流し直せることが求められています。
これらの問題を解決するために実施することはどれですか。3 つ選択してください。
解説
【正解: A / E / F】の理由
見るべきは重複・消失・再送です。まず A はイベントの id を条件付きで書くので、同じイベントの 2 回目は書き込みが失敗し、処理済みとして止まります。次に E は、EventBridge が関数を非同期で呼ぶので関数のエラーの再試行は Lambda が行い、使い切ったイベントは失敗時の送信先のキューに残せます。最後に F のアーカイブの再生は、ルールを指定して流し直せます。
【他選択肢が違う理由】
- B: 再試行を 0 回にすると一時的な障害でもイベントが失われます。また、メトリクスでは取り戻せません。
- C: ルールの DLQ は関数を呼べなかったときの受け皿です。そのため、関数のエラーで失われるイベントは入りません。
- D: EventBridge Pipes はイベントバスをソースに指定できません。また、重複を判定する機能もありません。
【参考】
AWS Docs: Lambda 非同期呼び出しのレコードのキャプチャ
AWS Docs: Amazon EventBridge でアーカイブされたイベントの再生を作成する
ある証券会社は、約 4,000 銘柄の価格更新を SNS FIFO トピックに発行し、取引とリスク管理の 2 つのシステムの SQS FIFO キューに配っています。銘柄の数は今後も増える見込みです。
発行側は全メッセージに同じメッセージグループ ID を付けており、市場が開くと発行がスロットリングされて価格の反映が数秒遅れます。両システムでは、銘柄ごとに更新を発行順で処理する必要がありますが、銘柄をまたいだ順序は問いません。
発行のスロットリングを解消する方法はどれですか。
解説
【正解: C】の理由
決め手は、上限を数える単位です。その点、FifoThroughputScope を MessageGroup にすると高スループットが有効になり、上限がトピック全体でなくグループごとになります。そこで銘柄コードをグループ ID にすれば、発行は約 4,000 のグループに分かれ、各銘柄の順序も FIFO のまま守られます。なお、銘柄をまたぐ順序は問われないので要件に合います。
【他選択肢が違う理由】
- A: 標準トピックと標準キューは配信の順序を保証しません。そのため、銘柄ごとの発行順を守れません。
- B: 1 つのキューのメッセージは、どちらか 1 つのシステムだけが処理します。そのため、もう一方には届きません。
- D: 同じ銘柄の更新が 5 分の間は重複として捨てられます。また、グループが 1 つのままで上限も変わりません。
【参考】
AWS Docs: Amazon SNS の高スループット FIFO トピック
AWS Docs: FIFO トピックの Amazon SNS メッセージ配信
あるオンライン教育サービスは、3 つのアベイラビリティーゾーンに分散した Auto Scaling グループの EC2 インスタンスで Web アプリケーションを動かしています。
ログイン中の受講者のセッション情報は各インスタンスのメモリに置き、ALB のスティッキーセッションで同じ受講者を同じインスタンスに送っています。そのため、スケールインやインスタンスの入れ替えのたびに受講者がログアウトされ、苦情が増えています。
セッションの読み書きにはミリ秒未満の応答が求められています。1 つのアベイラビリティーゾーンが停止しても、セッションを失わずに処理を続けることも要件です。
最も費用対効果の高い方法でこれらの要件を満たす構成はどれですか。
解説
【正解: B】の理由
決め手は、備える範囲と料金です。まず、マルチ AZ では ElastiCache がレプリカを別の AZ に分散し、プライマリの AZ の障害時はレプリカを自動でプライマリに昇格させて書き込みを続けます。また、ElastiCache はインメモリのデータストアで、ミリ秒未満で応答します。さらに備えるのは AZ の停止なので、リージョンをまたぐ構成の料金が要らず最も安く済みます。
【他選択肢が違う理由】
- A: セッションはインスタンスのメモリに残ったままです。そのため、AZ が止まればそのセッションは失われます。
- C: リージョンをまたぐ複製は AZ の停止への備えには過剰です。加えて、別リージョンのクラスターの料金がかかります。
- D: S3 のオブジェクトの読み書きはミリ秒未満では応答しません。つまり、応答時間の要件を満たせません。
【参考】
AWS Docs: Valkey および Redis OSS でマルチ AZ を使用して ElastiCache のダウンタイムを最小限に抑える
AWS Docs: グローバルデータストアを使用した AWS リージョン間のレプリケーション
