ネットワークに興味を持ち始めた当初からP2Pに対して興味があった。それに対して数年前、学術的発表でCDNに関する研究発表を聞き、CDNの存在を知って興味が出てきた。
今年はHDTV配信元年になるらしいのエントリの中でもCDNについて触れてみたが、今回、あらためて自分がCDNについて認知している点をまとめてみることによって、勉強としたい。
—-
CDNとはwikipediaによれば「Webコンテンツをインターネット経由で配信するために最適化されたネットワークのことである。コンテンツ配信網とも呼ばれる」とされている。つまりP2Pも広義の意味でCDNである。このブログではAkamaiのEdgeSuiteに代表される地理情報を加味した配信技術の意味でCDNという用語を扱ってきた。
地理情報を加味した配信技術としてのCDNでは、遠距離に存在するコンテンツをキャッシュする逆プロキシ(proxy)のような機能を主とする。
組織内におけるプロキシはその組織内からアクセスされたコンテンツをキャッシュ(一時保管)することができる。これはその組織内から再度そのコンテンツにアクセスする可能性が高いことを期待してキャッシュを行うものである。このキャッシュにヒットすれば、本来のコンテンツを持つサーバにアクセスすることなく、プロキシサーバまでの短距離の通信遅延のみでコンテンツを閲覧することが可能になる。
この組織内におけるプロキシをコンテンツ配信側が設置するものを逆プロキシという。この逆プロキシはコンテンツプロバイダーが設置する。多数のアクセスをさばくコンテンツプロバイダー(mixiなど)が設置すると効果を発揮するものである。
ある動的なコンテンツを表示しようとする場合、動的生成のためのコスト(CPUコスト、IOコスト、メモリコスト)がかかる。しかしながら、その表示するコンテンツは時間的な変化が少ないものとする。その動的生成のコストを、コンテンツをキャッシュすることによって、コストを下げたいと思う。その場合にいくつか方法があるが、その1つが逆プロキシである。逆プロキシを設置することによって最新更新は得られないが、コストをIOコストもしくはメモリコストに抑制して迅速な反応を行えるようにできる。
この逆プロキシをコンテンツプロバイダー組織内で行った場合、ある一定の効果が期待できる。しかしながら、地理的要因(例えば太平洋、大西洋を横断するような遅延)に対しては効果がない。太平洋を超える場合、ほぼ100msかかる。
世界的なコンテンツを扱っており、そのため利用者のアクセスに関わる遅延時間を短縮したいと思う場合(wikipediaのように)にはコンテンツプロバイダー側が世界に数台のサーバを用意し、ミラーする必要がある。
この手間を改善するためにCDNを商用でサービスする企業が複数存在する。
地理的要因を原因とする遅延はたいしたことがないと思われるかもしれないが、Chromeはなぜ速いのかという記事にあるとおり、待機時間によって収益性にシビアに効いてくる場合が存在する。
通常、検索結果には1ページ当たり10のリンクが含まれるが、ユーザーにどのぐらい検索結果数がほしいかと尋ねると、ほとんどの人がより多くと答えたという。ところが、実際に結果数を30に増やして実験したところ、トラフィックも収益も20%も落ちてしまったという。理由は、10の結果を返すのに0.4秒だったものが、30の結果を返すのに0.9秒と0.5秒余計にかかっているから、だったという。
googleのような検索結果の場合、文字情報を1レスポンスで応答するのみなので太平洋横断の0.1秒の差は感じられないかもしれない。しかしながら、画像の応答の場合はどうだろうか。ブラウザにおいては画像のロードは文字情報のロード(HTML)の後、複数回に分けられてリクエスト(要求)されるが、10〜20の画像が存在した場合、その遅延の合計は1〜2秒あたりになってしまい、これがブラウジングの引っ掛かりとして捕らえられてしまうケースも存在するだろう。
そのためCDNを商用でサービスする価値はあるし、実際に多くの企業が利用している。
このCDNの仕組みは、CDNの仕組みがわかりません 質問 [okyuu.com]にて詳しく説明されているが、逆プロキシの仕組みそのままであると考えられる。
本来コンテンツのページにて、CDNのURLドメインを持つCDNコンテンツ(例えば画像や動画)に対してリンクを張る。CDNドメインはDNS変換され、そのISPに最適化されたサーバへのIPが返信される。そのサーバへブラウザがHTTPリクエストを行うがHost情報の中に参照するべき本来コンテンツのドメインが入っているため、Virtual Hostが行われる。
Virtual Hostの設定に従い、もし、CDNコンテンツをCDNが保持していなければプロキシのように本来コンテンツの画像や動画にアクセスを行い、取得できればブラウザに応答する。保持していれば、即座にキャッシュのコンテンツをブラウザに応答する。前述の記事中では、親サーバが存在することを示唆しており、各CDNエッジサーバが何度も本来サーバにアクセスせずに済むという点が示唆されている。
#
このCDNの仕組みを自分でも構築することが可能だ(必要かどうかは疑問だが)。日本、ヨーロッパ、米国あたりでサーバをレンタルし、言語ごとにミラーリングすれば簡単だ。
この仕組みを膨大なものにし、逆プロキシの仕組みで利用企業が簡単に利用できるようにしたものが、商用CDNなのだろう。
勉強になった。