「Java News.jp(Javaに関する最新ニュース)」の安藤幸央氏が、CoolなプログラミングのためのノウハウやTIPS、筆者の経験などを「Rundown」(駆け足の要点説明)でお届けします。(編集部)
Webアプリケーションが広まるにつれて、レスポンスやリアルタイム性を重視することが多くなってきました。Webアプリケーションの形式によっては、ユーザーが主体的に操作してデータを取得するよりも、サーバ側が必要と思われるデータを送り付けることが主体の場合もあります。
例えば、Webブラウザを利用したチャットであれば、通常ページが更新されるのはリロードされたタイミングですが、サーバ・プッシュ型の実装がなされている場合は、新しいメッセージが追加された瞬間に、参加ユーザー全員に伝搬されなければいけません。
Webブラウザを活用したサーバ・プッシュの手法は、古くはNetscape Navigatorに実装されていましたが、あまり一般化しませんでした。現在は、「Comet」と呼ばれるHTTPのセッションをつなぎっ放しで、疑似的にサーバ・プッシュを実装する手法がAjaxとともに多く使われるようになってきました。
Cometは、AjaxライブラリDojoの作者でもあるAlex Russell氏が自身のブログで2006年の3月ごろ命名したものです。GmailにおけるGTalkの実装などで使われているサーバ・プッシュの手法や、以下のようなチャット系のWebアプリケーションで使われている技術として紹介されています。
一般的にサーバ・プッシュの技術が始まったのは、WebブラウザやJavaの黎明(れいめい)期とほぼ同時期でした。
その当時は、個人で利用するインターネットも低速で従量課金であったり、企業内インフラもそれほど整っていなかったりといった要因でサービスとしては早過ぎる衰退を迎えてしまいました。
その後、ブロードバンド環境が普及し、配信に耐え得るコンテンツも豊富になってきたことより、再びプッシュ型の情報配信が盛んになってきた機運が見てとれます。昨今のRSS/フィードの流行もその流れに沿ったものともいえるでしょう。
Tomcat 6.0よりNew I/O API(java.nioパッケージ)を利用すると、ごく簡単にCometのWebアプリケーションを開発できます。I/Oの拡張でブロックなしでリクエストが処理できるようになった成果と、Comet用のクラスが追加されています。
編集部注:Tomcat 6.0のCometについて詳しく知りたい読者は、「Tomcat 6で実現!Ajaxを超える通信技術Comet」をご参照ください。
Jettyはバージョン6よりContinuations(継続)機構が使えるようになりました。Jettyの場合、Tomcatに比べ比較的高速に動作し、実装の流れが分かりやすいのですが、負荷が高くなる傾向があります。ちなみに、Jetty 6はJBossやApache GeronimoのWebコンテナとして組み込まれています。
編集部注:JBossについて詳しく知りたい読者は、「米JBossは米Red Hatとマーケットシェア拡大を狙う」を、Apache Geronimoについては、「Apache族最後の戦士Geronimo」をご参照ください。
GlassFish 2で使われているHTTPコネクタであるサーバ・フレームワークGrizzlyでCometが利用できます。Grizzlyでの実装は「gCometd」と呼ばれていて、「非同期Polling」とも呼ばれるロング・ポーリング(サーバ・プッシュとクライアント・プルを併用した方式)も利用できます。
高速軽量Webサーバlighttpdで利用できるサーバ・プッシュ環境のモジュールとして動作します。また、FdAjax自身も軽量動作します。
本コラムの第25回でも取り上げたJava/XML、AjaxでRIAを実現する技術Nexaweb。実は、この技術でもHTTP/HTTPSを通じてサーバ・プッシュが利用できます。オプションとしてPollingも可能です。
2007年12月、WebSphere Application Serverのバージョン6やCommunity Editionバージョン2に使うアドオンでも、Ajaxを使ったComet型サーバ・プッシュを実現できることが発表されました(参考)。
DWR(Direct Web Remoting)はAjax用のJava+JavaScript連携用フレームワークです。「リバースAjax」と呼ばれるサーバ・プッシュ機能を利用できる。Comet、Polling、Piggybak方式を採用できます。
DWRにおけるPiggybakはほかの通信のタイミングに合わせてデータを付加してやりとりする方式です。帯域消費が少ない一方、Comet式に比べ遅くなります。
編集部注:DWRのサーバ・プッシュ技術について詳しく知りたい読者は、「リバースAjax機能はAjax+Javaをもっとやさしくする?」をご参照ください。
負荷が低く、スケールアウトも考えられているため、ユーザー数の多いチャットなどにも使いやすいものです。現在開発中のもので、Subversionのリポジトリから最新版のコードを取ってくる必要があるなど扱いが比較的面倒です。
編集部注:Subversionについて詳しく知りたい読者は、「バージョン管理に便利なSubversiveプラグイン」をご参照ください。
サーバ側のイベントをWebブラウザ上で動作しているJava、JavaScript、Flashに送信するためのフレームワークです。
Adobe Flexサーバのためのサーバ・プッシュ環境(旧、Adobe LiveCycle Data Services ES(無償)をオープンソース化したもの)です。Adobe AIRアプリケーションやJavaでも利用でき、バイナリ通信のためAjax、JSONよりも高速に動作するのがうたい文句となっています。
編集部注:BlazeDSについて詳しく知りたい読者は、「JavaとFlex/AIRをつなぐ「炎」のオープンソース」をご参照ください。
プッシュ型のサービスを提供する場合、負荷対策とスケーラビリティに関する部分が問題視されます。
大規模Webサービスを提供する場合、特にCometを利用した場合によく取りざたされるのはC10K問題(クライアント1万台問題)です。
これは1万〜10万規模のクライアントが同時に1つのサーバに接続したときに生じる問題のことを示します。極度のアクセス集中が起こったときにどのように対処すべきかあらかじめどのような対策を行っておくべきかが難しい点です。
通常のWebアプリケーションにおけるC10K問題は、リクエスト待ちの数であり、多少混雑した場合も、時間を置けば、また利用できるといった状況です。
それに比べ、Cometの場合のC10K問題は処理中のリクエストの数にまでおよび、最悪の場合サービス全体が停止してしまう状況にもなり得ます(参考:「"The C10K Problem" C10K問題の分析と対処方法(日本語訳))。
技術的にできることからWebアプリケーションを作るのではなく、作りたいWebアプリケーションを考えて、技術的に解決しようとすると、数多くの問題に出合うことでしょう。
Cometもそういった中から生まれてきた「苦肉の策」ともいえるアプローチです。ネットワーク、TCP/IPの範疇(はんちゅう)で問題に出合った場合、技術的な歴史が長い分、大抵の場合すでに解決法や対処法が編み出されている場合が多いのが心強い点です。
ブロードバンド環境や、高機能な携帯電話、高機能なパソコン、豊富なコンテンツといった土壌と素材は十分過ぎるほどそろっています。技術的な要因で、サービスに制限がもたらされるのではなく、理想的なサービスを実現するために、技術が最大限の工夫やノウハウを駆使して問題を解決し、実現してほしいものです。
次回は 2008年3月初めごろに公開の予定です。内容は未定ですが、読者の皆さんの興味を引き、役立つ記事にする予定です。何か取り上げてほしい内容などリクエストがありましたら、編集部や@ITの掲示板までお知らせください。次回もどうぞよろしく。
安藤幸央(あんどう ゆきお)
1970年北海道生まれ。現在、株式会社エクサ マルチメディアソリューションセンター所属。フォトリアリスティック3次元コンピュータグラフィックス、リアルタイムグラフィックスやネットワークを利用した各種開発業務に携わる。コンピュータ自動彩色システムや3次元イメージ検索システム大規模データ可視化システム、リアルタイムCG投影システム、建築業界、エンターテインメント向け3次元 CG ソフトの開発、インターネットベースのコンピュータグラフィックスシステムなどを手掛ける。また、Java、Web3D、OpenGL、3DCG の情報源となるWebページをまとめている。
ホームページ
Java News.jp(Javaに関する最新ニュース)
所属団体
OpenGL_Japan (Member)、SIGGRAPH TOKYO (Vice Chairman)
主な著書
「VRML 60分ガイド」(監訳、ソフトバンク)
「これがJava だ! インターネットの新たな主役」(共著、日本経済新聞社)
「The Java3D API仕様」(監修、アスキー)
Copyright © ITmedia, Inc. All Rights Reserved.