2010.02.23
tel

押してダメなら引いてみよう

前回、チャットシステムの簡単な説明とその問題点を簡単にお話させていただきましたが、今回はそんな問題点を解決「できるかもしれない」そんな素敵な技術のご紹介です。

そもそも、チャットシステムの問題点、というよりもHTTP通信の基本的なルールとして「クライアントからアクセスがこない限りサーバーからデータを送ることができない」という点がありました。

それを簡単に図に示すと、以下のようになります。

クライアントとサーバーのデータの流れ

というわけで、今回もくら君とサバ氏にご協力を頂きましたが、赤い枠で囲まれているのが1セットの「クライアントからのリクエストと、サーバーからのレスポンス」とお考えください。

これはチャットシステムだけではなく、掲示板でもBLOGでもTwitterでも同じような流れになります。ただし、チャットシステムの場合はこの赤い枠で囲まれたやりとりが「更新の有る無しに関わらず一定時間ごとに行われる」という点が独特であり、問題点とされてきたことです。

では、この問題点を解決するために一体どのようなことを行えばいいのでしょうか?

ここまでさんざん引っ張りましたが、ようやくご紹介いたしましょう。これまでの常識を覆すための手法の一つ、Comet(コメット)です。

コメットさんです

ということでコメットさんです。実写版のほうではありませんよ。

……えー、さて。そんなコメットさんは一体どうやってこれまでの常識を覆すというのでしょう?やはり、魔法の力なのでしょうか?

これからその魔法をごくごく簡単にご説明させていただきます。

まずは先程のシーケンス図を見てみましょう。

先ほどと同じ図です

ここから一部抜き出してみます。

一部分を抜き出してみました

クライアントからのリクエストとサーバーからのレスポンスですね。

ここでついに魔法の出番です。この赤い枠、つまりは常識を捨てて次のように考えてみます。

青い枠に注目して

この部分だけ見ると、サーバーのレスポンスが先にありクライアントのリクエストが後にあるように見えませんか?

もっと分かりやすくするために、矢印の距離を変えてみましょう。

このようにしてみると……

すると、なんということでしょう。

まるでサーバーからデータが送られるのが先に着ているように見えませんか?

まるでサーバーからデータが送られてきて、それを元にクライアントが動作をしているように「見える」じゃありませんか!

ああ!石を投げないでください!手品じゃないんです、魔法なんですよ!だってどちらも英語じゃMagicじゃないですか!?

実を言いますと、Cometというのは「コロンブスの卵」、というか「裏の裏は表」というか、つまるところそういう「ちょっと考え方を変えてみました」という物なのです。

「クライアントからのリクエストにサーバーがすぐレスポンスを返すから無駄が生じるのであって、何か起きるまでサーバーがレスポンスを返さなければそれってつまり無駄のない通信になるんじゃね?」という考え方に基づいた技術、ということですね。

ではでは、これにて一件落着めでたしめでたし……とそうはすんなり行かないのが世の常。

Cometにも問題点と呼べる部分があり、だからこそ「できるかもしれない」と最初に書かせていただいたのです。

そもそも、「クライアントからリクエストが来て、サーバーがそれに対するレスポンスを返す」というのは大前提です。

この大前提を守るため、Webサーバーは「来た要求をなるべく早く返そう」という信念を持っています。

毎日毎時間毎分沢山のリクエストが送られてくるサーバーですが、本当に「同時」と呼べるほどまったく同じタイミングでリクエストが来ることは稀です。

ということは、来たリクエストをできるだけ早く処理できれば当然全体で見たときに処理できる件数というものは増えます。

また、とっとと仕事してしまえば、ある程度メモリやCPUに負担がかかる作業であっても、それほど悪影響を及ぼすこともありません。

普段は仕事をテキパキとこなすサバ氏

Cometは「クライアントからのリクエストにぎりぎりまでレスポンスを返すのを待つ」という考え方なのですから、この考え方と真っ向から対立するものです。

考え方が真っ向から対立するということは、つまるところメリットとデメリットが逆転するということにつながります。

メリットはもちろん、「せっかくの要求ですが、なにもありませんでした」という状況を極力減らせること。

そして、デメリットは「同時に処理しなければいけないリクエストの数が山ほど増える」ということで、つまり「CPUとメモリにやさしくない」ということになります。

今までと違うやりかたに戸惑いを隠しきれません

これを解決するには、つまるところ今までのサーバーではダメで、きちんと「できるだけ同時に処理しつつ、メモリやCPU負荷といったものを減らす」サーバーが必要になります。

実は、すでにいくつかそのようなサーバーや既存のサーバーに追加することでそのような処理を可能にするための仕組みというものもあったりするのですが、それでもやはりまだまだ問題点はあるようです。

しかし、いつかそのような問題点も払拭され誰もが気軽にリアルタイムなWebサーバーとの通信というものが可能になる日もきっと来ることでしょう。

「コロンブスの卵」のコロンブスとは、つまるところ新大陸を発見した人物です。

Cometというコロンブスの卵からも、きっと新大陸のようなあっと驚く何かが生まれるのではないか?と個人的にとても期待しながら、今回はここまで。(tel)

一覧に戻る