双方向通信を実現するHTML5関連技術WebSocketを実装した3つのアプリケーションサーバの実装の違い・性能などを徹底検証する。
2012年の10月にWindows 8が発売され、そこに搭載されたInternet Explorer(以下、IE) 10ではHTML5の機能が利用できるようになりました。また、2013年の2月にWindows 7版のIE 10もリリースされ多くのユーザーがHTML5の恩恵を受けられるようになりました。
HTML5の機能の多くは、Webブラウザ側で実装されれば、HTMLやCSSを適切に記述することで利用が可能です。しかし、今回取り上げるWebSocketはサーバ側でも機能の実装が必要です。このため、WebSocketを利用する場合はWebブラウザだけではなくサーバを選ぶ必要があります。
WebSocketそのものの技術的な解説は、以下のように@ITの過去記事でも充実していますので、今回はWebSocketを実装したサーバそれぞれの実装の違い・性能などを見ていきます。
比較するのは3つのサーバで、Javaで実装されたアプリケーションサーバであるApache TomcatとJetty、それに加えて少々毛色は異なりますが、JavaScriptを使ってサーバアプリケーションが記述できるNode.jsとNode.jsでWebSocketを利用する際に利用するフレームワークであるSocket.IOです。
以降、各サーバ製品の性能比較について、使用する環境、テストパターンを説明していきます。
今回利用するサーバと、クライアントは以下の通りです。
各サーバともに頻繁にバージョンアップが行われており、検証を行った時点で利用していた上記のバージョンはすでに古くなっています。その上、Jettyはメジャーバージョンアップ、Node.jsも0.8系から0.10系に最新版が切り替わり、以下の比較結果が、そのまま今のバージョンでも当てはまらないこともあるかと思いますが、その点はご了承ください。
クライアントについては、筆者がJavaでの開発に親しんでいたこともあり、上記のライブラリを利用して作成しています。Tomcat/Jettyは同じクライアントプログラムを使っていますが、Socket.IOは専用のクライアントを作っています。
WebSocketはプロトコル仕様とAPI仕様が別々に作成されており、それぞれ別の団体が仕様策定を行っています。API仕様も、もともとはクライアント側の仕様のみ策定が進められていましたが、サーバ側はJavaのAPI仕様が2012年からJCP(Java Community Process)で策定が進められてきました。
プロトコルは、すでに多くの版を重ねており、版が進むにつれ機能の追加やセキュリティ対応などがされていますので、クライアントとサーバで対応するプロトコルバージョンに違いがあると利用できません。
まずは、このプロトコルについて各サーバの実装状況を解説します。
WebSocketのプロトコルは、IETF(Internet Engineering Task Force)で策定が行われています。クライアントとサーバのハンドシェイクでは、プロトコルヘッダ中の「Sec-WebSocket-Version」を利用して、双方で利用可能なバージョンの確認を行います。この「Sec-WebSocket-Version」はhybi-04(draft-ietf-hybi-theWebSocketprotocol-04)以降設定されるようになっています。
この「Sec-WebSocket-Version」とプロトコルドラフトバージョンの対応は以下の通りです。
Sec-WebSocket-Version | hybi-XX |
---|---|
4 | hybi-04 |
5 | hybi-05 |
6 | hybi-06 |
7 | hybi-07 |
8 | hybi-08 - hybi-12 |
13 | hybi-13 - RFC6455 |
【1】Tomcatでの対応状況
TomcatでのWebSocket対応の歴史はまだ浅く、2012年夏にリリースされた7.0.27から対応しています。プロトコルも最新のバージョンであるRFC6455への対応のみとなっています。このため、古いWebブラウザとの組み合わせで使えないため、注意が必要です。
【2】Jettyでの対応状況
JettyでのWebSocket対応の歴史は古く2009年リリースの7.0.1から実装が進められており、現在までにリリースされているすべてのプロトコルに対応しています。古いブラウザでサポートされていたWebSocketでも利用できるところが特徴です。
【3】Node.js/Socket.IOでの対応状況
Node.js上のフレームワークであるSocket.IOではhybi-07からhybi-16のプロトコルに対応しています。hybi-16のSec-WebSocket-Versionは13となりますので、最新のプロトコルバージョンに対応していることになります。
このように各サーバでプロトコルの対応状況は異なりますが、最新のWebブラウザであればRFC6455に対応しており、多くのWebブラウザは自動更新により最新版へのバージョンアップを強制するようになっているため、どのサーバを利用しても問題はないと思われます。
次にAPI仕様への対応状況です。前述の通り、API仕様はクライアント側とサーバ側で別に仕様が策定されています。ここでは、JavaのAPI仕様についてのみ対応状況を見ていきます。API仕様であるJSR356(JavaTM API for WebSocket)は2013年4月22日にFinal Approval Ballotが完了しています。
このAPI仕様については、Tomcatでは現在開発中のTomcat 8から、Jettyでは2013年3月8日にリリースされたJetty 9からサポートされています。
JSR356により、これまでサーバごとにバラバラだったサーバサイドのWebSocketアプリケーション構築手段が統一され、より作りやすくなることと思われます。
次ページでは、今回テスト用にアプリケーションを作るに当たり、はまった点、困った点などを記載していきます。
Copyright © ITmedia, Inc. All Rights Reserved.