at posts/single.html

リアルタイムなチャット

チャットの話。 Web でのチャットは、定期的にログを再読み込みする方式が主流で、他の人の発言が表示されるまでに少しタイムラグがある。 Ajax が普及して差分リロードができるようになっても、クライアントから定期的にログを読み込んでいるのは変わってない。 これは、 HTTP の仕様上しかたがないと思っていたら、更新履歴兼雑記で本当にリアルタイムなチャットが公開されていた。

要するにたいていの AJAX は Asynchronous と言いつつも1秒おきだのでポーリングしてるわけですね。しかしそれでは1秒おきにしか発言が来ないしサーバに1秒おきにアクセスするし…でイマイチなわけです。

で、このチャットで何をしているかというと、まず起動時にサーバに対してコネクションをはります。ですがサーバは sleep(30) とかして返事をしません。で、誰かが発言をした時に、そのプロセスに対して SIGUSR1 が飛びます。そのハンドラではじめて返事をします。

HTTP コネクションを張りっぱなしにしておいて、ログが更新された瞬間にレスポンスを返す方式みたい。 ログを更新したプロセスと、待機していたプロセスの間は、シグナル (SIGUSR1) を使ってやりとりをする、と。 なるほどねぇ…。

試しに使わせてもらったけど、発言欄に言葉を入力している途中でも、その文字が画面上に見えるようになっていた。 他の人の入力途中の文字も、(ほぼ)リアルタイムで見ることができる。

使ってみないと分からないかもしれないけど、この「リアルタイム感」が新鮮だった。 従来のポーリング方式でも数秒の遅れで発言は届く訳だから、使う側からするとそれほど違いは無いと思っていた。 でも、この数秒の差が大きいみたい。 チャットだから文字だけなんだけど、より「人と話している感」を感じられた。

ところで、このコネクション方式だと、誰かが発言したときにだけ通信が発生するので、従来のポーリング方式に比べてネットワークやサーバの負荷の面では有利かもしれない。

だけど、コネクション方式の課題は、 Web サーバの同時接続数が増えてしまうことかな。 誰かが発言するまでずっとコネクションを繋いだまま待機しているので、 Web サーバに対して常に参加者分のコネクションが張られている状態になる。 Web サーバの同時接続数には限りがあるので、レンタルサーバに設置するのは少し厳しいかもしれない。 (と言っても、従来の方式でもサーバに負荷がかかることには違いなく、そもそもチャットの設置を禁止しているレンタルサーバも多い)

それから、リアルタイムで発言が表示されるので、普段のIMEの癖が相手に丸分かりだったりする。 それはそれで面白いし、他の適用範囲も広そうだけど、従来の Web の概念とは違うので抵抗感を感じる人もいるかも。 ちょうど1年くらい前に日記に書いた、Ajax とプライバシーを思い出した。

なんだかまとまりが無いけど、新しい可能性を感じさせるということで。

関連する日記