動画配信システムの設計

YouTubeやNetflix級の配信をどう組むか、アップロードからトランスコード・アダプティブ配信・CDN・規模見積もりまで、面接で通る解答の型で押さえられる。

応用システム設計動画配信HLSCDNトランスコードスケーラビリティ最終更新: 2026-07-29
3つの要点
TL;DR
  1. 投稿系(UGC)は書き込みが重くトランスコードのファンアウトが本質、視聴系(VOD)は読み取りが桁違いに重くCDNヒット率が全てになる。まず要件で立ち位置を決める。
  2. アップロードした原本をチャンクごとに複数ビットレートへ並列トランスコードし、HLS/DASHのプレイリストとセグメントへ分割。プレーヤーが帯域と再生バッファを見てビットレートを毎セグメント切り替える。
  3. 規模の桁が設計を決める。1日500万本・平均300MBなら原本だけで日1.5PB、多解像度で数倍。視聴ピーク数十Tbpsはオリジンでは捌けずCDNエッジのヒット率95%以上が前提になる。

要件と規模の見積もり

まず「どちらの動画配信か」を確定させます。YouTube型はユーザー投稿(UGC)で誰でもアップロードし本数が爆発的に増え、書き込みとトランスコードが重い。Netflix型はプロが用意した有限のカタログ(VOD)で、投稿は日次バッチに近く、支配的なのは視聴の読み取りです。両者は「アップロード+トランスコードのパイプライン」と「配信網」を共有しますが、力点が逆なので、機能要件と非機能要件を先に固定します。

  • 機能要件: 動画のアップロードとトランスコード、複数解像度でのストリーミング再生、再生位置のシーク、視聴回数などのメタデータ、検索とおすすめ。
  • 非機能要件: 再生の低遅延な開始(起動2秒以内)と途切れない再生(リバッファ率を最小化)、高可用性、投稿から視聴可能になるまでの許容遅延(数分〜数十分で可)。ここで「アップロードは遅くてよいが視聴は速く」という非対称性が設計を規定します。

数値をフェルミ推定で桁まで置きます(YouTube型を主対象、根拠を明示した仮定)。

項目仮定見積もり
投稿本数1日500万本約58本/秒
原本サイズ平均10分・300MB/本書き込み日1.5PB(原本のみ)
派生データ1本を5解像度へ、合計で原本の約2倍実効ストレージ 日約4.5PB増
視聴回数1日50億再生平均約5.8万再生/秒
視聴ピーク帯域同時1000万視聴・平均5Mbpsピーク約50Tbps

肝は読み書きの比です。投稿58本/秒に対し視聴5.8万/秒はおよそ1000倍で、視聴が完全に支配します。しかも動画1本のペイロードは記事や画像より桁違いに大きく、ピーク50Tbpsという帯域はデータセンターのオリジンから直接は供給不能です。したがって「配信はCDNのエッジで終わらせ、オリジンにはほぼ到達させない」ことが最上位の設計制約になります。

大枠の設計

全体は明確に分離した3系統で構成します。判断根拠は、それぞれ負荷特性が全く違うため独立にスケールさせたいからです。

  • アップロード&処理系: クライアント → アップロードサービス → オブジェクトストレージ(原本) → トランスコードのジョブキュー → ワーカー群 → 派生(複数ビットレート)を再びストレージへ。
  • 配信系: プレーヤー → CDNエッジ(HLS/DASHのセグメントを配信、ヒット率が命) → ミスのみオリジン(ストレージ)へ。
  • メタデータ系: 動画メタ・視聴回数・ユーザー・おすすめのためのDB群と、検索インデックス。

APIは最小限、次の形にします。アップロードは巨大ファイルなので、サーバーを経由させず署名付きURLでオブジェクトストレージへ直接、かつ分割(マルチパート)で送らせるのが定石です。

POST /videos                      -> 動画IDを発番、メタデータの器を作成
POST /videos/{id}/upload-url      -> 署名付きの分割アップロードURLを返す
                                     (クライアントがストレージへ直接PUT)
POST /videos/{id}/complete        -> 全パート完了を通知、トランスコード起動
GET  /videos/{id}                 -> メタデータとマニフェストURLを返す
GET  /videos/{id}/master.m3u8     -> 解像度一覧のマスタープレイリスト(CDN経由)

データモデルは、可変で頻繁に更新される数値(視聴回数)と、不変に近い実体(動画メタ)を分けます。視聴回数のような高頻度カウンタをリレーショナルDBの1行で更新すると行ロックが競合するため、書き込みに強いストアへ寄せます。

データ特性ストア選択と理由
動画メタ(題名・投稿者・長さ)更新まれ・読み取り多リレーショナルDB。整合性と結合が要る
視聴回数・いいね超高頻度の加算書き込み最適化ストア(後述のLSM系)
セグメント/原本の実体巨大・不変・追記のみオブジェクトストレージ+CDN
検索・おすすめの特徴量全文検索・近傍探索検索エンジン/特徴量ストア

メタデータの水平分割(シャーディング)は video_id をキーにします。動画は互いに独立で結合をまたぐ必要が薄く、キー分散で素直にスケールするからです。分割方式の選び方はシャーディング戦略、ノード増減時の再配置を最小化する割り当てはコンシステントハッシュ法を前提にします。

主要コンポーネントの深掘り

トランスコードのファンアウト。 1本の原本を複数の解像度・ビットレート(例: 240p/480p/720p/1080p/4K)へ変換します。ここでの鍵は、動画を数秒単位のチャンクに切ってから並列変換することです。10分の動画を1本のワーカーで直列に全解像度エンコードすると分単位で待たされますが、6秒チャンクへ分割すれば数百の断片を数百ワーカーで同時処理でき、投稿から視聴可能までの遅延が桁で縮みます。処理はDAG(有向非巡回グラフ)として組みます。分割 → 各チャンク×各解像度のエンコード(ここが最大のファンアウト) → セグメント化とプレイリスト生成 → サムネイル抽出、の順に依存します。

ジョブ配分はメッセージキューで行い、ワーカーはプリエンプティブルな計算資源で安く回します。ここで配信保証の設計判断が要ります。トランスコードは冪等(同じ入力から同じ出力)に作れるので、少なくとも一度(at-least-once)で配送し、重複実行は出力の上書きで吸収するのが実務的です。配信セマンティクスの整理はメッセージキューの配信保証を参照してください。

HLS/DASHによるアダプティブ配信。 変換結果は「マニフェスト(プレイリスト)」と「セグメント」に分けて置きます。マスタープレイリストが解像度の一覧を示し、各解像度のメディアプレイリストが数秒ごとのセグメント(.ts や fMP4)を列挙します。

master.m3u8
├─ 480p/index.m3u8  ├─ seg0.ts, seg1.ts, ...(各6秒)
├─ 720p/index.m3u8  ├─ seg0.ts, seg1.ts, ...
└─ 1080p/index.m3u8 └─ seg0.ts, seg1.ts, ...

アダプティブビットレート(ABR)の本質は、切り替え判断がサーバーではなくプレーヤー側にあることです。プレーヤーは直近セグメントのダウンロード速度と再生バッファの残量を監視し、次に取得するセグメントの解像度を毎回選び直します。帯域が細ればより低いビットレートへ、バッファに余裕が戻れば上げる。セグメントを短く(6秒前後)固定するのは、切り替えの粒度を細かくしつつ、リクエスト数の増加とのバランスを取るためです。HLSとDASHは思想はほぼ同一で、コンテナと対応環境が違います。

観点HLSMPEG-DASH
策定Apple国際標準(MPEG)
対応の広さApple系で必須・実質どこでもコーデック非依存で柔軟
マニフェスト.m3u8(テキスト).mpd(XML)
実務での扱いiOS/Safari向けに事実上必須Android/Web中心で採用

CDNとエッジキャッシュ。 50Tbpsのピークをオリジンへ通さない仕組みがここです。セグメントは不変(一度作れば書き換えない)なのでキャッシュに極めて向きます。人気動画の冒頭セグメントほど繰り返し要求されるため、エッジのヒット率は容易に95%を超えられます。到達経路の制御はDNSやAnycastで最寄りエッジへ誘導し、エッジミス時のみ上位キャッシュ、最後にオリジンという多段構成にします。CDNの内部動作はCDN、エッジや前段での負荷分散はL4ロードバランサの内部を土台にします。Netflix型では、需要予測に基づき人気タイトルを深夜のうちにISP網内のキャッシュ(Open Connect相当)へ先回りで押し込む「事前配置」も併用し、ピーク時のオリジン負荷をほぼゼロにします。

セグメントを不変にする効果

セグメントに一意なパス(バージョン付き)を与えて絶対に上書きしない設計にすると、CDNのキャッシュ無効化がほぼ不要になります。差し替えは新パスの新セグメントを作ってマニフェストを指し替えるだけで済み、エッジは古いセグメントを自然に失効させます。

メタデータとおすすめ。 おすすめは大きく2段です。まず候補生成で数百万本から数百本へ荒く絞り(協調フィルタリングや、視聴履歴を埋め込みベクトル化した近傍探索)、次にランキングで機械学習モデルが視聴継続確率などを推定して並べ替えます。候補生成を近傍探索に寄せるのは、全カタログのスコア計算が計算量的に非現実的だからです。特徴量やモデルの学習パイプラインはAIの領域と重なります。

ボトルネックとトレードオフ

横にスクロール

動画原本を変換キューで複数品質へ変換しCDN配信と保存階層化を行う図
投稿と視聴の経路、適応配信、保存階層、視聴回数の非同期集計を整理します。

スケール時に効いてくる論点を、代替案の比較で押さえます。

視聴回数カウンタのホットスポット。 バズった動画は毎秒数万の加算が1キーに集中し、単純な行更新では競合します。厳密な即時一致を諦め、エッジやアプリ層で一定時間バッファして周期的にフラッシュする「近似カウント+非同期集計」にします。視聴回数はビジネス上、多少の遅延や誤差が許容される代表例で、正確性より書き込みスループットを優先する判断です。書き込み最適化ストアの内部はLSMツリーを参照。

ストレージ階層とコスト。 全動画を高速ストレージに置くのは非現実的で、アクセス頻度で階層化します。ロングテール(大多数の動画はほとんど見られない)という視聴分布を前提に、視聴減衰に応じてホット→ウォーム→コールドへ自動で移送します。

階層対象トレードオフ
ホット(CDN+高速ストレージ)人気動画・新着の冒頭高速だが高コスト、容量は絞る
ウォーム(標準オブジェクトストレージ)通常の原本・派生バランス型、オリジンの主戦場
コールド(アーカイブ)長期未視聴極めて安価だが取り出しに遅延

強整合か可用性か。 動画配信は視聴の可用性を最優先し、多くの箇所で結果整合を選びます。投稿直後に世界中で同時に見えなくても、数分の伝播遅延は許容されます。この判断の理論的背景はCAP定理にあり、分断時に一貫性より可用性を取る典型です。一方で課金や視聴権限のように誤りが許されない領域だけは強整合を守り、系統ごとに整合性レベルを使い分けます。

面接での要点

最初の一手で読み書き比を桁で示し、視聴支配とCDNヒット率の重要性を宣言できると評価が上がります。トランスコードは「チャンク分割による並列化」、配信は「ABRの判断はプレーヤー側」、カウンタは「近似+非同期集計」を、いずれも理由付きで言えることがゴールです。

分散システム全般の基盤はデータベース、配信網とプロトコルはネットワーク、運用とデプロイはDevOpsの各トピックも併せて参照してください。

システム設計の記事ガイド

動画配信システムの設計を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

システム設計

比較で見る軸

難易度: advanced / カテゴリ: システム設計 / タグ数: 6

導入後に効く点

アップロードした原本をチャンクごとに複数ビットレートへ並列トランスコードし、HLS/DASHのプレイリストとセグメントへ分割。プレーヤーが帯域と再生バッファを見てビットレートを毎セグメント切り替える。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
システム設計
タグ数
6

判断チェックリスト

  • 自社の用途が「システム設計 / 動画配信」に近いか確認する。
  • 強みである「投稿系(UGC)は書き込みが重くトランスコードのファンアウトが本質、視聴系(VOD)は読み取りが桁違いに重くCDNヒット率が全てになる。まず要件で立ち位置を決める。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

システム設計動画配信HLSCDNトランスコード