「システム設計の面接試験」を読んだので、個人的な学びなどを以下メモしておきます。図解多めで普段業務で触らない部分についても触れてあり、勉強になりました
システム設計の面接試験:章ごとの個人メモ
| 章 | タイトル | 主なテーマ/学習ポイント (淡々と) |
|---|---|---|
| 第1章 | ユーザー数ゼロから数百万人のへのスケールアップ | システム拡張の基本。負荷分散、DBレプリケーションによる読み込み分散、キャッシング、CDN導入。Web層は状態を持たないステートレス化が必須。DB拡張は水平スケーリング(シャーディング)が基本。構成要素の疎結合化と信頼性向上のためにメッセージキューを採用する。 |
| 第2章 | おおまかな見積もり | 容量計算のための数値感覚を習得。2のべき乗の把握。プログラマが知っておくべきレイテンシの数値(メモリは速い、ディスクは遅い)を理解する。可用性(SLA)の概念と9の数によるダウンタイムの理解。面接では、正確な計算より四捨五入/概算と前提条件/単位の明記が重要。 |
| 第3章 | システム設計の面接試験のフレームワーク | 面接を成功させる4ステップ: 1. 問題理解/範囲明確化(3〜10分)、2. 高度な設計提案/賛同獲得(10〜15分)、3. 設計の深掘り(10〜25分)、4. まとめ(3〜5分)。最初のステップでの質問による要件定義が特に重要。 |
| 第4章 | レートリミッターの設計 | トラフィック制御によるDoS防止、コスト削減が目的。実装は信頼性の高いサーバー側(APIゲートウェイ)で行う。主要アルゴリズム:トークンバケット、リーキーバケット、固定ウィンドウカウンタ、スライディングウィンドウログ/カウンタ。分散環境では、Redisを利用し、レースコンディションや同期の問題を解決する必要がある。 |
| 第5章 | コンシステントハッシュの設計 | サーバーの追加・削除時にデータ再配置を最小化する技術。従来のハッシュ方式で発生する再ハッシュ問題を軽減する。ハッシュ空間をリング状にし、仮想ノードを使ってキーの分布の偏りを是正する。 |
| 第6章 | キーバリューストアの設計 | 分散K/Vストア(NoSQL)の設計。CAP定理(一貫性、可用性、分断耐性)のトレードオフ理解が前提。データの分割にはコンシステントハッシュ、一貫性確保にはクォーラムコンセンサス ($W+R>N$) を使用。可用性を優先する場合、不整合解消のためにベクトルクロックによるバージョン管理が必要。永続的な障害対応にはマーケルツリーが有効。 |
| 第7章 | 分散システムにおけるユニーク ID ジェネレータの設計 | グローバルに一意で、ソート可能で時間と共に増加するIDを効率的に生成する課題。マルチマスターレプリケーションやUUIDの課題点を検討。TwitterのSnowflakeアプローチ(タイムスタンプ、データセンターID、マシンID、シーケンス番号で構成される64ビットID)が最も要求を満たす解決策。 |
| 第8章 | URL 短縮サービスの設計 | 長いURLを短くし、リダイレクトするサービス。リダイレクトには301(恒久的)または302(一時的)を使用。短いURL生成は、ユニークなIDをBASE62変換するか、ハッシュ関数と衝突判定を行う。読み込み負荷が高いため、マッピング情報はキャッシュ層に保存し、パフォーマンスを向上させる。 |
| 第9章 | Web クローラの設計 | 検索エンジンのインデックス作成などが目的。設計上の重要課題はスケーラビリティ、堅牢性、ポライトネス(ホストへの過剰なリクエスト回避)。URLフロンティアがURLの優先順位付けとポライトネスの確保を担う中心コンポーネント。 |
| 第10章 | 通知システムの設計 | プッシュ通知(APN/FCM)、SMS、eメールをサポートする。初期設計のSPOFやパフォーマンスボトルネックを回避するため、DB/キャッシュを外部に移動し、メッセージキューを導入して構成要素を分離する。信頼性向上のため、通知データをDBに永続化し、再試行メカニズムを実装する。 |
| 第11章 | ニュースフィードシステムの設計 | ニュースフィードの設計は、フィードの公開(投稿時)とニュースフィードの構築(読み込み時)の2つの主要フローに分けて考える。 |
| 第12章 | チャットシステムの設計 | リアルタイム通信技術として、ポーリング、ロングポーリング、WebSocketの採用を検討する. |
| 第13章 | 検索オートコンプリートシステムの設計 | 効率的な入力補完機能を提供するため、データの管理とクエリに**トライ木(Trie)**データ構造を利用する。 |
| 第14章 | YouTube の設計 | 動画アップロード、ストリーミング、そして再生を可能にするためのトランスコーディング(符号変換)のワークフロー設計が中心となる。 |
| 第15章 | Google ドライブの設計 | ファイル同期サービスの設計。API、同期統合、ブロックサービス、メタデータDBの管理、高一貫性の要求、および障害処理が主要な論点である。 |