大手ストリーミング事業者(Youtube、Netflix)は、一般のWeb用CDNとは異なり、URL生成(ホスト名指定)と呼ばれる方法でトラフィック制御(ユーザがアクセスするサーバを指定)しています。
ここで、(一般的なCDNで使われているDNSやBGP Anycastによるトラフィック制御ではなく)ホスト名指定を使用する理由は、ストリーミングの以下のようなサービス特性によります:
- コンテンツ量が多いため、キャッシュ制御がシビアである
- 全コンテンツをエッジサーバでキャッシュさせるとキャッシュヒット率が落ちる。マイナーなコンテンツはオリジンサーバのみから配信する等の制御が必要である。DNSやAnycast制御ではサーバ単位の制御しかできず、コンテンツ単位の制御を行うにはホスト名指定やURL生成が必要となる。
- トラフィック制御のレイテンシに寛容である
- プレイヤーは、ストリーミング再生の度にアクセスするホストをCDNに対して問い合わせるため、その分(0.1秒程度)のディレイが発生する。これはWebアクセスのような画面変化へのディレイとしては許容されないが、ストリーミングのようなアプリケーション起動であれば許容範囲となる。
- その他理由
- ストリーミングの場合、動画自体のURLはコンテンツ管理システムがもともと動的に生成している(Webの場合URLは固定)
- ユーザは動画自体のURLを直接見ることは無い(Webの場合、ユーザはURLでコンテンツを認識している)
- ストリーミングサービスがそれぞれ独自の動画プレイヤーを提供しており、プレイヤーで様々な制御が可能(Webの場合、ブラウザは標準ブラウザを使う。細かな制御も難しい)
国内独自実装への道(プラン)
国内で本式なストリーミング用CDNを実装した場合の概要を記載します:
- サーバの種類
- コアサーバ
- ミラーベース(全コンテンツを保持する)
- 東京と大阪に配置
- エッジサーバ
- キャッシュベース(コアサーバをオリジンサーバとする)。
- ISP等に配置
- コアサーバ
- リクエスト制御
- コンテンツ別制御
- メジャーコンテンツ:コアサーバとエッジサーバの両方から配信する
- マイナーコンテンツ:コアサーバのみから配信する
- 補足
- メジャー・マイナーは、それぞれのコンテンツの属性として制御される。内部的には「コンテンツのメジャー属性がONであれば、エッジサーバを利用する」というルールとなる
- ネットワーク別制御
- レベル1(デフォルト、大まか):地域別制御 (IPアドレスの県別情報)
- 東京と大阪のサーバに割り振る、ざっくりとしたデフォルト制御(ネットワーク的に最適ではない場合がある)
- レベル2(中粒度):AS別制御(IPアドレスのAS(ネットワーク)番号)
- ISP内部にエッジサーバがある場合はそれを使用する
- 地域別情報を上書きする詳細制御(東京、大阪)
- レベル3(詳細):IPブロック別制御
- ISP内部の詳細制御(ISP内部に複数ロケーションでエッジサーバを展開している等)
- レベル1(デフォルト、大まか):地域別制御 (IPアドレスの県別情報)
- コンテンツ別制御
実装サンプル
GeoLite2をベースにしたサンプルを以下のページに配置しました。