本文へ移動

ホーム / SRE / 第6部 面接の実践

第6部 面接の実践・第15章

システム設計面接の進め方

★★☆ 重要11トピック・面接 3問

正解の構成を当てる試験ではない。要件を確認し、規模を見積もり、トレードオフを説明しながら面接官と対話で設計を深めることが評価される。

  1. 要件の確認(5分):機能要件、非機能要件(可用性、レイテンシ、一貫性)、ユーザー数、読み書きの比率を質問する

  2. 規模の見積もり(5分):QPS、ストレージ量、帯域を概算する

  3. 全体構成(10分):主要コンポーネントとデータの流れを描く

  4. 深掘り(15分):ボトルネック、DB設計、キャッシュ、スケーリング

  5. 障害と運用(10分):故障時の挙動、監視、デプロイ、SLO。SRE面接ではここが最も重視される

最初の10分で前提をそろえ、最後の10分を障害と運用に残す要件確認5分見積もり5分全体構成10分深掘り15分障害と運用10分SRE面接では最後の「障害と運用」が最も見られる。時間配分を口に出して管理すると印象が良い
システム設計面接45分の時間配分

時間が足りなくなりやすいのは深掘り。障害と運用の時間を必ず残す。

分類質問の例
機能必須の機能は何か、後回しでよい機能は何か
規模1日のアクティブユーザー数、ピーク時のリクエスト数、データ量の増え方
読み書き読み取りと書き込みの比率、書き込み直後に読む必要があるか
一貫性多少古いデータでもよいか、厳密な一貫性が必要か(お金・在庫)
可用性どれくらい止まってよいか、どの機能が最も重要か
レイテンシ何ミリ秒以内に返す必要があるか
地理ユーザーは国内だけか、世界中か
制約予算、既存システム、チームの規模
項目目安
1日の秒数約 86,400 秒(概算では 10万秒)
1日 100万リクエスト平均 約12 QPS、ピークは平均の 2〜5 倍で見積もる
メモリ参照約 100 ナノ秒
SSD のランダム読み込み約 100 マイクロ秒
同一データセンター内の往復約 0.5 ミリ秒
日本と米国の往復約 100〜150 ミリ秒
項目前提計算結果
書き込み1日1億件の短縮URL作成1億 ÷ 10万秒約 1,000 QPS(ピーク 3,000)
読み取り書き込みの100倍1,000 × 100約 10万 QPS(ピーク 30万)
1件のサイズURL+メタデータ-約 500バイト
5年分のストレージ1億件 × 365日 × 5年1,825億件 × 500B約 90TB
キャッシュ読み取りの上位20%を保持1日分の20%約 10GB / 日

見積もりは桁が合っていれば十分。計算の前提を口に出すことが大事。

読み取りが書き込みの100倍。キャッシュで読みを受け止める書き込み(約1,000 QPS)読み取り(約10万 QPS)ユーザー短縮APIID生成重複しない短いIDDB約90TB / 5年ユーザーCDN / LBキャッシュ人気URLを保持ミス時のみ301(恒久)か302(一時)か:302ならクリック数を数えられるが、CDNで返しにくい
URL短縮サービスの構成

読み取りと書き込みの比率が設計を決める。見積もりから構成を導く。

観点問われること
アーキテクチャ選択冗長化、キュー、リトライ、分離の境界をどう置くか
障害時の挙動一部障害時の動作、縮退運転、リトライストーム、重複イベント
運用の現実性ダッシュボード、オーナーシップ、デプロイ方法、ロールバック手段
トレードオフなぜこの設計か、何を犠牲にし、何を守るのか

15.6よく出るお題

★★☆ 重要
お題主な論点
URL短縮サービスID生成、読み取り中心のキャッシュ、リダイレクトのレイテンシ
通知システム(メール / プッシュ)キュー、冪等な送信、チャネルごとの隔離、外部APIのレート制限
ログ収集・監視基盤大量書き込み、バッファリング、保持期間とコスト、取りこぼし
レート制限器アルゴリズム選択、分散環境でのカウンタ共有(Redis)
チャットシステムWebSocket、メッセージの順序と配信保証、既読管理
フィード / タイムライン書き込み時配信と読み取り時集約の使い分け
ファイルアップロード・画像配信署名付きURL、オブジェクトストレージ、CDN、非同期変換
チケット販売(アクセス集中)在庫の整合性、待合室(キュー)、事前スケール

要件:メール・プッシュ・SMS で通知を送る。1日1,000万通、重要な通知(パスワードリセット等)は確実に届ける。

コンポーネント役割設計のポイント
通知API送信リクエストを受け付けるステートレス、冪等キーで二重送信を防ぐ、受付後すぐ返す
ユーザー設定DB通知の受信設定、連絡先キャッシュして読み取りを高速化
メッセージキューAPIと送信処理を分離チャネルごと、優先度ごとにキューを分ける
送信ワーカー各チャネルの外部サービスへ送る外部サービスのレート制限に合わせて流量制御、リトライ
デッドレターキュー失敗し続けた通知を退避監視して手動・自動で再送
送信ログ送信状況の記録重複送信の防止、問い合わせ対応
キューで受付と送信を切り離し、失敗は退避して再送する通知APIステートレス、冪等キーで二重受付を防ぐユーザー設定DB+キャッシュメッセージキューチャネル・優先度ごとに分離送信ワーカー流量制御・リトライ・重複排除デッドレターキュー失敗し続けた通知を退避外部配信サービスメール / プッシュ / SMS参照失敗が続く復旧後に再投入受付後すぐ応答を返す処理できる量だけ取り出す送信(通知IDで重複を防ぐ)
通知システムの構成例

キューが受付と送信の間に入ることで、外部サービスが落ちても受付は止まらず、回復後にまとめて送れる。

面接官からの追加質問答え方
メール配信サービスが落ちたら?サーキットブレーカーで遮断し、キューに溜めて回復後に送る。重要通知は別の配信サービスへフェイルオーバー
同じ通知が2回届いたら?at-least-once 前提なので、通知IDで送信済みを記録して重複を排除
キャンペーンで一斉送信すると?一斉送信用のキューを分け、重要通知が遅れないようにする(バルクヘッド)
どう監視する?キューの滞留時間、送信成功率、チャネルごとのレイテンシをSLIにする

要件:数百台のサーバーとコンテナから1日数TBのログを集め、検索と長期保存をしたい。

段階選択肢判断の観点
収集Fluent Bit、Vector、OpenTelemetry Collector軽量さ、バッファリング、再送
転送・バッファKinesis Firehose、Kafka取りこぼし防止、スパイクの吸収
検索用ストアOpenSearch、Loki、Datadog検索速度とコスト。全文検索が必要か
長期保存S3(Glacier へ自動移行)監査要件の保持期間、Athena で検索
可視化・アラートGrafana、Kibana、Datadogログからのメトリクス化

論点:大量のログをすべて高価な検索ストアに入れるとコストが膨らむ。重要度でサンプリングや保持期間を分ける設計を提案できるとよい。

課題対策
販売開始直後に数十万アクセス待合室(仮想キュー)で入場を制御、静的ページはCDNから配信
在庫の二重販売在庫の減算をDBの条件付き更新や Redis のアトミック操作で行う
座席の一時確保TTL付きで仮押さえし、期限切れで解放
決済の失敗決済と在庫確定を Saga で管理し、失敗時は在庫を戻す
事前準備負荷試験、事前スケール、関係チームとの当日の体制

GoogleのSRE面接にある NALSD(Non-Abstract Large System Design)は、抽象的な設計にとどまらず「サーバーが何台必要か」「ディスクやネットワーク帯域は足りるか」を具体的な数字で詰める形式。既存システムを理解し、ボトルネックと故障モードを見つけ、現実的に段階的な改善案を出せるかが見られる。

15.11よくある失敗

★★☆ 重要
失敗なぜ評価が下がるか
要件を聞かずに描き始める問題の理解が浅いと判断される
最初から過剰な構成にする規模に合わない設計はコスト感覚がないと見られる
流行の技術名を並べる選んだ理由とトレードオフを説明できないと逆効果
障害時の話をしないSRE面接で最も見られる部分を落としている
一人で話し続ける面接官のヒントや関心を拾えない

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 要件確認 → 見積もり → 全体構成 → 深掘り → 障害と運用 の順で進める
  • 見積もりは桁が合えば十分。前提を口に出す
  • SRE面接では障害時の挙動とトレードオフの説明が最も見られる

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1URL短縮サービスを設計してください。

模範回答

まず規模と要件を確認します。仮に1日1億件の作成とすると書き込みは約1,000 QPS、読み取りはその100倍の約10万 QPSと見積もり、読み取り中心の設計にします。短いIDは連番をBase62で変換するか、衝突しない生成器を使います。読み取りはCDNとキャッシュで受け、DBはキーで引けるKVSやシャーディングで拡張します。最後に、キャッシュやDBが落ちたときの挙動、監視するSLI、悪用対策まで話します。

深掘りされたら

  • 301と302のどちらでリダイレクトしますか?
  • 同じURLを2回短縮したら同じIDにしますか?

見られているポイント見積もりから設計判断を導けるか

Q2レート制限器を設計してください。

模範回答

誰に(ユーザー、IP、APIキー)、どの粒度で制限するかを確認します。アルゴリズムはバーストを許容できるトークンバケットが一般的です。複数台のサーバーで共有するためカウンタはRedisに置き、アトミックな操作で更新します。超過時は429とRetry-Afterを返します。Redisが落ちたときに全リクエストを通すか止めるかも決めておきます。

深掘りされたら

  • Redisへの問い合わせ自体が遅延の原因になりませんか?

見られているポイント障害時の振る舞いまで決めているか

Q3設計した仕組みのどこが最初にボトルネックになりますか?

模範回答

見積もった数字をもとに、各コンポーネントの処理能力と比べて答えます。多くの場合、書き込みが集中するDB、特定のキーに集中するキャッシュ、外部APIのレート制限が先に詰まります。そのうえで、計測すべき指標と、限界に近づいたときの対策(シャーディング、キュー、事前スケール)を述べます。

深掘りされたら

  • それを本番で事前に確かめるには?

見られているポイント数字にもとづく判断