連載
» 2007年12月12日 00時00分 公開

Tomcatはどこまで“安全”にできるのか?(3):Tomcat 6で実現!Ajaxを超える通信技術Comet (1/3)

[x-labチーム,株式会社アメニクス]

Ajaxを超える? Tomcat 6で搭載されたCometとは?

 前回はTomcatを“安全”に活用するために、ツールを使った運用の仕方やTomcatの設定について解説しました。

 今回はTomcatの安全性から少し離れて、Tomcat 6の新機能の利用方法について解説します。Tomcat 6では、いくつかの大きな拡張がありましたが、今回はJ2SE 1.5で実装されたNew I/O APIjava.nioパッケージ)を用いたComet(コメット)通信について解説します。

おさらい 「通常のHTTPでの通信」

通常のHTTPでの通信はクライアントWebブラウザなどからサーバリクエストを送信し、サーバはリクエストを解釈してレスポンスを返します。つまり、通信のタイミングはクライアント側が握っており、サーバ側から見ると好きなタイミングで通信ができないので、クライアントのWebブラウザから発信されるリクエストに対してレスポンスを返す、という処理を1サイクルとして行っている「プル型の通信」といえます。


疑似的なリアルタイム通信

 プル型の通信では、サーバ側で情報の更新があった場合などにリアルタイムにデータを取得できません。現在のWebアプリケーションで「疑似的なリアルタイム」のデータ更新を行うためには、クライアント側から定期的にリクエストを送信するなどの対応を取っています。

 しかし、このような処理はクライアント・サーバに掛かる負荷が大きいという問題に併せて、通信負荷が非常に大きくなりクライアント数が増えれば増えるほど処理するトラフィックが増えてしまうという問題があります。

クライアント側だけでなくサーバ側からも非同期処理を実現するComet

 このような問題を解決するために開発された技術がCometです。Cometは、HTTPの通信をそのまま利用しつつ、疑似的な「プッシュ型通信」を行う仕組みになっています。

 Cometでは、まずクライアントから発行されたリクエストをサーバ側で受けた後に、HTTPコネクションをサーバで開きっぱなしにするため、クライアントに対して送信するはずのサーバからのレスポンスを待たせます。こうすることで、データ送信のタイミングをサーバ側へ委譲します。こうして、自分が送信したリクエストの内容を反映させる場合や、ほかの人が送信したリクエストに対してサーバが処理したいときに、レスポンスを返します。

 サーバがクライアントへレスポンスを返した直後に、またクライアントからリクエストを送信させることでまた先の状態に戻り、疑似リアルタイム通信ができるようになり、チャットのようなリアルタイム更新アプリケーションの実装ができるようになります。

図1 Cometアーキテクチャ 図1 コメットのアーキテクチャ(@IT「リバースAjax機能はAjax+Javaをもっとやさしくする?」より再掲載)

 Ajaxは、クライアント側からの非同期処理を実現する技術ですが、Cometはそれに加えて、サーバ側からの非同期処理も実現できる技術なのです。詳細は@ITの記事「リバースAjax機能はAjax+Javaをもっとやさしくする?」をご参照ください。

Tomcatを用いてCometを実装するには?

 Tomcat 6では、Cometを実装できるコネクタは2つあります

APRコネクタは専用ライブラリが必要

 1つはNIO(New I/O)のコネクタを用いる方法で、もう1つはAPR(Apache Portable Runtime)コネクタを用いて実装する方法です。

図2 APRのぺージ 図2 APRのぺージ

 APRを用いる方法は、2007年12月現在では導入に専用ライブラリの導入など必要なので、今回はNIOコネクタを用いてCometを実装してみましょう。

NIOコネクタを使用するためのTomcatの設定

 まず、NIOコネクタが利用できるようにTomcatの設定を変更します。server.xmlをエディタで開いて次のように編集してください。server.xmlの中身の詳細は前回の「Tomcatの主要な設定はserver.xmlで」以降をご参照ください。

 server.xmlを開いたら、connectorのprotocolを「org.apache.coyote.http11.Http11Protocol」から「org.apache.coyote.http11.Http11NioProtocol」へと変更します。

server.xmlの変更
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080"
      protocol="org.apache.coyote.http11.Http11NioProtocol"
      connectionTimeout="10000" redirectPort="8443"
      scheme="http" secure="false" />
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost" appBase="webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false" />
    </Engine>
  </Service>
</Server>

 ファイルの編集が終わったら保存し、Tomcatを再起動することでNIOコネクタが有効になります。後からweb.xmlの修正で再起動が必要になるので、取りあえずこのまま次に移りましょう。

 Tomcat 6でCometを使うための設定はこれで終わりです。次ページではCometを使ったチャットアプリケーションの実装方法を解説します。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。