Chuyển đến nội dung chính

レッスン 1: システム設計とは何ですか? - 概要とロードマップ

システム設計について紹介し、システム設計が必要な理由、システム設計の問題 (要件 → 高レベル設計 → 詳細 → ボトルネック) へのアプローチ方法を紹介します。モノリス システムと分散システムを比較します。学習ロードマップと必要なリソース。

🏗️ アーキテクチャ — レッスン 1 レッスン 1: システム設計とは何ですか? - 概要と ロードマップ

システムアーキテクチャ: ゼロからヒーローへ

パート 1: システム設計の基礎

xdev.asia

はじめに

簡単な CRUD アプリケーションは数時間で作成できます。しかし、そのアプリケーションが 数百万のユーザーにサービスを提供し、毎秒数千のリクエストを処理し、99.99% の稼働率を保証する必要がある場合、システム設計が必要になります。

システムデザインは面接のための知識だけではありません。これは次のことに役立つ中心的なスキルです。

  • スケーラブルなシステムを構築する
  • アーキテクチャ上の適切な決定を下す
  • コストのかかる間違いを避ける (システム全体をリファクタリングする)
  • 技術的な決定についてチームと効果的にコミュニケーションをとる

1. システム設計とは何ですか?

1.1 定義

システム設計 は、特定の要件を満たすソフトウェア システムのアーキテクチャ、コンポーネント、モジュール、インターフェイス、およびデータを決定するプロセスです。

System Design = Architecture + Components + Data Flow + Trade-offs

1.2 システム設計はなぜ重要ですか?

フェーズシステム設計なしはい システム設計
プロトタイプ速くて簡単明確な計画を立てる
100 ユーザーうまくいきますうまくいきます
10,000 ユーザースロースタートまだ安定しています
100 万ユーザーシステムがクラッシュしたため、書き直す必要がありました計画に従って規模を拡大する
コストリライト = 10x 初期コスト段階的な改善

1.3 システム設計とコーディング

Coding:          "Làm sao để implement feature X?"
System Design:   "Làm sao để feature X hoạt động với 10M users,
                  99.99% uptime, <100ms latency?"

2. システム設計問題へのアプローチ方法

2.1 フレームワークの 4 つのステップ

システム設計の問題に直面した場合は、次のフレームワークを使用してください。

┌─────────────────────────────────────────────────────┐
│  Step 1: Requirements & Constraints                  │
│  ┌─────────────────────────────────────────────┐    │
│  │ Functional Requirements (FR)                 │    │
│  │ Non-functional Requirements (NFR)            │    │
│  │ Constraints & Assumptions                    │    │
│  └─────────────────────────────────────────────┘    │
│                      ▼                               │
│  Step 2: High-Level Design                           │
│  ┌─────────────────────────────────────────────┐    │
│  │ Main components & connections                │    │
│  │ Data flow diagrams                           │    │
│  │ API design (endpoints)                       │    │
│  └─────────────────────────────────────────────┘    │
│                      ▼                               │
│  Step 3: Deep Dive into Core Components              │
│  ┌─────────────────────────────────────────────┐    │
│  │ Database schema                              │    │
│  │ Algorithm choices                            │    │
│  │ Data structures                              │    │
│  └─────────────────────────────────────────────┘    │
│                      ▼                               │
│  Step 4: Identify & Resolve Bottlenecks              │
│  ┌─────────────────────────────────────────────┐    │
│  │ Single points of failure                     │    │
│  │ Scaling strategies                           │    │
│  │ Monitoring & alerting                        │    │
│  └─────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────┘

2.2 例: ニュース閲覧システムの設計

ステップ 1 - 要件:

  • FR: ユーザーは記事リストを表示し、詳細を読み、検索し、コメントします。
  • NFR: 1,000万日、 <200ms latency, 99.9% availability
  • Constraints: Read-heavy (100:1 read/write ratio)

Step 2 - High-Level Design:

Users → CDN → Load Balancer → Web Servers → Cache → Database
                    │
                    └→ Search Service (Elasticsearch)

Step 3 - Deep Dive:

  • Database: PostgreSQL cho articles, Redis cho cache
  • 検索: 全文インデックス付き Elasticsearch
  • CDN: Cache static assets + rendered HTML

Step 4 - Bottlenecks:

  • Database read bottleneck → Add read replicas
  • 人気の記事 → TTL による積極的なキャッシュ
  • Search latency → Elasticsearch cluster scaling

3. Monolith vs Distributed Systems

3.1 Monolithic Architecture

┌─────────────────────────────────────┐
│         Monolithic Application       │
│  ┌─────┬─────┬─────┬─────┬──────┐  │
│  │ UI  │User │Order│Pay  │Search│  │
│  │Layer│ Svc │ Svc │ Svc │ Svc  │  │
│  └─────┴─────┴─────┴─────┴──────┘  │
│  ┌─────────────────────────────┐    │
│  │      Shared Database         │    │
│  └─────────────────────────────┘    │
└─────────────────────────────────────┘

アドバンテージ:

  • 初期開発が簡単
  • 導入が簡単 (アーティファクト 1 つ)
  • デバッグが簡単 (単一プロセス)
  • コンポーネント間のネットワーク遅延なし

短所:

  • 個々のパーツをスケールするのが難しい
  • 小さなエラーがシステム全体をクラッシュさせる可能性があります
  • コードベースが大きいとデプロイが遅くなる
  • Technology lock-in (1 language/framework)

3.2 Distributed Systems

┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐
│ User   │  │ Order  │  │Payment │  │ Search │
│Service │  │Service │  │Service │  │Service │
│  DB    │  │  DB    │  │  DB    │  │  DB    │
└───┬────┘  └───┬────┘  └───┬────┘  └───┬────┘
    │           │           │           │
    └───────────┴─────┬─────┴───────────┘
                      │
              Message Queue / API Gateway

アドバンテージ:

  • 各サービスを個別にスケーリングする
  • 障害の分離 (1 つのサービス障害 ≠ システム全体の障害)
  • チームの自律性 (各チームが 1 つのサービスを所有)
  • Technology diversity

短所:

  • はるかに複雑
  • サービス間のネットワーク遅延
  • Data consistency challenges
  • Operational overhead (monitoring, debugging)

3.3 いつ何を選択するか?

基準モノリス分散
Team size< 10 developers> 10 人の開発者
交通< 10K RPS> 10,000 RPS
フェーズMVP、早期起動成長、規模
複雑さ中程度高
展開頻度毎週/毎月毎日/時間ごと

アドバイス: ほとんどのシステムは Monolith から始めて、必要に応じて分散システムに分岐する必要があります。最初からオーバースペックにしないでください。


4. 把握すべき中心的な概念

4.1 システム設計マップ

                    System Design
                         │
    ┌────────────────────┼────────────────────┐
    │                    │                    │
Fundamentals        Components           Patterns
    │                    │                    │
├─ Scalability      ├─ Load Balancer    ├─ Microservices
├─ Availability     ├─ CDN              ├─ Event-Driven
├─ Consistency      ├─ Cache            ├─ CQRS
├─ Latency          ├─ Database         ├─ Saga
├─ Throughput       ├─ Message Queue    ├─ Circuit Breaker
├─ CAP Theorem      ├─ API Gateway      ├─ DDD
└─ Networking       ├─ Reverse Proxy    └─ Serverless
                    └─ Search Engine

4.2 学習ロードマップ

Tháng 1-2: Fundamentals
  ├─ Scalability, Availability, Consistency
  ├─ CAP Theorem
  └─ Networking basics

Tháng 3-4: Infrastructure Components
  ├─ Load Balancer, CDN, Cache
  ├─ Database (SQL, NoSQL, Sharding)
  └─ Message Queues

Tháng 5-6: Architectural Patterns
  ├─ Microservices, Event-Driven
  ├─ CQRS, Saga, DDD
  └─ Serverless

Tháng 7-8: Case Studies & Practice
  ├─ Design URL Shortener
  ├─ Design Chat System
  ├─ Design News Feed
  └─ Design Video Streaming

5. 封筒の裏の計算

システム設計における重要なスキルは、迅速な見積もりです。

5.1 2 の累乗

パワー正確な値およそバイト
101,0241,0001KB
201,048,576100万1MB
301,073,741,82410億1GB
401,099,511,627,7761兆1TB

5.2 すべてのプログラマーが知っておくべきレイテンシの数値

L1 cache reference:                    0.5 ns
L2 cache reference:                      7 ns
Main memory reference:                 100 ns
SSD random read:                   150,000 ns  =  150 μs
HDD seek:                      10,000,000 ns  =   10 ms
Send 1 MB over 1 Gbps network: 10,000,000 ns  =   10 ms
Read 1 MB from SSD:             1,000,000 ns  =    1 ms
Read 1 MB from HDD:            30,000,000 ns  =   30 ms
Roundtrip same datacenter:        500,000 ns  =  500 μs
Roundtrip CA → Netherlands:   150,000,000 ns  =  150 ms

5.3 例: Twitter のストレージの見積もり

Giả sử:
- 500M users, 200M DAU
- Mỗi user tweet 2 lần/ngày
- Mỗi tweet: 140 chars * 2 bytes = 280 bytes
- 10% tweets có media (ảnh 200KB trung bình)

Tweets/ngày: 200M * 2 = 400M tweets
Text storage/ngày: 400M * 280B = 112 GB/ngày
Media storage/ngày: 40M * 200KB = 8 TB/ngày

Storage/năm: (112GB + 8TB) * 365 ≈ 3 PB/năm

6. まとめ

トピックス重要なポイント
システム設計大規模な要件を満たすシステムを設計する
フレームワーク要件 → 高レベル → 詳細 → ボトルネック
モノリスモノリスから始めて、必要に応じて分離
分散より複雑ですが、スケーリングが可能です。
見積もり設計前に必ず見積もりを行う

演習

  1. 見積もりの実践: 1 年間に YouTube に必要なストレージの見積もり (5 億 DAU、1 日あたりアップロードされるビデオ 500 万本、トランスコード後のビデオあたり平均 50MB)

  2. モノリス vs 分散: あなたは、ベトナム市場 (500 万ユーザー) 向けのホテル予約アプリケーションを構築しています。モノリスと分散のどちらを選択しますか?その理由を説明してください。

  3. システム設計フレームワーク: 4 ステップのフレームワークを適用して、レストラン予約管理システム (50,000 のレストラン、100 万のユーザー) の設計をスケッチします。