HuluやNetflixのような、動画共有サービス全般に適用できるアーキテクチャ
構成はシンプル
- クリエイターがが動画をアップロード
- 視聴者はそれをクリックして視聴する
- 内部はシンプルではない
- 月ごとのアクティブユーザ数:2ビリオン
- USに住む大人の73%はYouTubeを使う
- 2019年の広告収入は15.1ビリオンだが、これは2018年から36%も増加している
- 全モバイルインターネットトラフィックの37%である
- 80言語で使用されている
とてつもなく巨大なシステム
- 動画視聴以外にもたくさんの機能がある
- コメント、共有、イイね、保存、チャンネル登録 など すべてを面接中に設計するのは不可能なので絞ろう
候補者「どの機能が大切か?」 面接官「ビデオアップロードと視聴」 候補者「サポートすべきデバイスは?」 面接官「モバイルApp、WEBブラウザ、スマートTV」 候補者「DAUの想定は?」 面接官「5ミリオン」 候補者「ユーザは1日どれくらいYouTubeを見る?」 面接官「30分」 候補者「多言語対応すべき?」 面接官「はい」 候補者「ビデオの拡張子はどれに対応すればよい?」 面接官「ほとんど」 候補者「暗号化は?」 面接官「必要」 候補者「ビデオのサイズは?」 面接官「小~中程度のビデオに絞る。最大1GB」 候補者「AWS,GCP,Azureなど既存のインフラを使用してもよい?」 面接官「良い質問。 すべてを1から作るのは現実的ではない。」
本システムの設計において、我々は以下だけに集中する。
- ビデオアップロードを高速に
- スムーズなビデオ視聴
- ビデオの画質を変更する
- インフラコストを抑える
- 高可用性、スケーラブル、リライアビリティ
- サポートするデバイス:モバイルApp、WEBブラウザ、SmartTV
多くの仮置きを含むが、会話のためにこれらは大切
- 5DAU
- ユーザは5動画/day視聴する
- 10%のユーザが1動画/dayアップロードする
- 平均ビデオサイズは300MB
- 総ストレージスペース/day = 5ミリオン*10%*300MB=150TB
- CDNの費用
- CDNがビデオを提供するとき、CDNからデータが送られる際にコストがかかる
- CloudFront使用で試算:USから100%とすると:5ミリオン*5ビデオ *0.3GB *0.02$ = 150,000$/day
- 高額であり、無視できないことがわかる。費用を削減することも検討したい。
- 設計はフルスクラッチではない.特にインタビューの場面では尚更そう.
- 時間制限がある中で,正しい技術スタックの概要を提示することは,詳細を詰めるよりも大切
- CDNを1から作ることは高コスト
- NetflixはAWS, FacebookはAkamaiを使用している
- Client:ユーザはYoutubeをPC,スマホ,スマートTVで視聴する.
- CDN:動画はCDNに蓄積され,適宜配信される.
- API Servers:動画のストーミング以外はAPIのやり取りで実施される. - おすすめ紹介,動画のURL,サインアップなど
実はこの2つだけ
- 動画のアップロード導線
- 動画を視聴するまでの導線
- User:ユーザはYoutubeをPC,スマホ,スマートTVで視聴する.
- Load balancer:処理分散
- API Servers:全ユーザはAPIリクエストベースで進む(ビデオ視聴は除く)
- Metadata DB:ビデオメタデータが貯められる.高可用性やパフォーマンス向上のために用いられる
- Metadata cache:ビデオメタデータやユーザのobjectがキャッシュされる
- Original Storage:BLOB storage system.元動画を蓄積する.
- オブジェクトストレージで構成された、単一障害点の無い、スケーラブルなストレージです
- https://www.cloudou.net/storage/blob006/
- Transcoded storage:トランスコードとは、あるデータ形式で圧縮・符号化された動画データなどを、同じ形式で画素数などの仕様が異なるデータに符号化しなおすこと。そのBLOBストレージ
- CDN
- Completion queue:ビデオトランスコードのイベントを貯めるMessage Queue
- Completion handler:Completion queueからイベントデータを持ってきたり,metadata cache/DBを更新するワーカー
この上で,動画アップロードの導線は次の2つに分割される: A:生のビデオをアップロードする
B:ビデオのmetadataを更新する.これにはURL,size,format,ユーザ情報などが含まれる