[INDEX]
2001-08-21

Web画面の自動更新

オークションなどのWebサイトでは、入札の状態が表示されるようになっている。意欲のある入札者はぎりぎりまでねばってより有利な入札を行うため、終了時間の間際に頻繁に状態を確認するために「更新」ボタンを押してページを更新し続ける。HTTPというプロトコルを使ったWebという性質上、普通はクライアント(ブラウザ)側からアクションを起こさないとコンテンツの更新は行われないからである。
Yahooオークション(http://www.yahoo.co.jp)
入札状況の一覧を見ることができるが、自動更新はされない。残り時間をリアルタイム表示するAppletはあるが、これはブラウザ側で勝手にカウントダウンして表示しているだけで、最新の入札状況を見るためには入札者が手動でページの更新をしなければならない。
楽天オークション(http://www.rakuten.co.jp)
Yahooと同じで、最新状況の自動表示機能はない。残り時間のリアルタイム表示はない。
Gooオークション(http://www.goo.ne.jp)
Yahooと同じで、最新状況の自動表示機能はない。残り時間のリアルタイム表示はない。
このアクションはサーバにとって非常に負荷の高いものとなる。入札状況のようなダイナミックなコンテンツは、サーバ側で実行されるプログラムの結果を表示するものなので、固定的なコンテンツよりもただでさえ負荷が高い。ましてや、ある時間帯に集中的に複数のユーザが同じ行動を取ることによってその負荷が集中することになる。サーバに十分に余力があれば良いが、それとて無限ではない。また、アクセスの集中度が低い場合にはそれほど問題にはならないかもしれないが、アクセス数が少ないことはそのWebシステムが本来の目的を果たしていないことを示しているという矛盾がある。

Webには固定時間おきにコンテンツを自動更新するようなオプションはあるので、この機能を使えば、たとえば数分おきに自動的に最新状況を表示するような実装は可能である。しかし、十分に残り時間があるときならともかく、終了時間まぎわにはユーザは自分でどんどん更新ボタンを押して最新状況を見ることになるだろう。これでは、自動更新という仕組みがほとんど無意味であり、ユーザが意志をもってページを更新する場合よりもサーバの負荷が増えてしまう。

最善の解決策は、タイマ駆動型ではなくイベント駆動型のシステムとすることである。ユーザが手動で更新ボタンを押すこともある意味イベント駆動型と言えるが、そうではなく「誰かが入札した」というイベントによって更新されるということである。ユーザも最新状況が示されることが保証されているならば、更新ボタンを連打することもないだろう。しかし、HTTP+HTMLというクライアント・プルの基本的なWebの仕組みだけではイベント駆動型のシステムを作ることはできないので、

など別のアプリケーションと組み合わせる必要がある。しかも、サーバ・プッシュとするためのRMIなどのHTTP以外の通信プロトコルが必要となる。(クライアント側のアプリケーションにHTTPサーバ機能を持たせればHTTPでも構わないけれど。)

HTTP以外の通信プロトコルを使うとすれば、ファイアウォールもしくはProxyサーバの存在がネックとなる。特に企業のWebサーバはファイアウォールに守られていて、普通はWebサーバ側から外部に対してHTTPリクエストを送ることはできないようになっているだろう。あるいはクライアントがファイアウォールの中にあって、Proxy経由で接続する場合にも、妙な通信プロトコルは通してもらえないはずだ。つまり、企業内イントラネットのシステムでない限り、普通のHTTP以外のプロトコルを使用するシステムは実用にならないということになる。

では「基本的なWebシステム」のアイテムで、どこまでそれらしいことができるかを考えてみよう。まず使えるアイテムは

  1. HTTP
  2. HTML
  3. JavaScript
  4. Java Applet
  5. CGIなどのサーバ側アプリケーション
  6. Webサーバ
である。

1. HTTPのRefreshヘッダ

実はRefreshヘッダは良く使われているが、HTTP 1.0/1.1仕様には定義されていない。サーバに負担がかかるのでなるべくやめたほうが良い。

2. HTMLのMETAタグ

1.の方法の別解。できれば1.を使うべきである。

3. JavaScriptで更新する

ページの内容が変わったかどうかだけをサーバに問い合わせ、変わったときだけページ全体を更新する。あるいは、最低金額だけをアクセスカウンターのように数字画像で示しておき、その画像を切り替えるという手もできそう。

4. Javaアプレットで更新する

JavaScriptと違ってHEADリクエストを送れるのでサーバの負荷は減らせる。画像を用意する必要もない。がんばればリスト全体を書き換えることもできる。この場合はXMLなどで差分情報だけを送るような仕組みにしておけばなお良い。

5. サーバ側でわざとページを返さない

最初の一覧は素直に返さなければいけないが、そのページは定期的にreloadさせ、サーバ側は変更があるまでレスポンスを返さないようにする。するとあたかも変更があったタイミングでページが書き換えられるように見える。ブラウザのアイコンが回りっぱなしになるのが気持ち悪いし、Webサーバではリクエスト単位にサーバプロセスが1つ割り当てられるので、閲覧者の数だけプロセスが必要になる。サーバ側で変更イベントをどう伝えるかが次の課題である。

以上
kazm-s@shorindo.com