ふろしき.js

Web + Mobile + UX + Performance Tech

大規模システムにWebSocket/ServerSentEventsは入れて良いのか?

ブラウザの方はそこそこにポテンシャルが追いついてきたHTML5。

「WebSocket/ServerSentEventsとかさ、大規模なシステムへの導入しちゃおうぜ」ってボヤいては、血色の良かったエンジニアの肌がみるみる青ざめて「正気か?オマエ!?」とか罵られるのがここ最近の私の趣味でございます。

それでまぁ一応「何故?」と聞いてみるのですが、その理由は皆バラバラ。なので、現時点でのWebSocket/ServerSentEventsの大規模システム導入についての問題点を、だいたい私の知っている範囲でまとめてみました。

1. JavaEE7対応のAPサーバ製品が少ない

WebSocketなどHTML5の通信系技術を使うとなると、やはりNode.jsになるのでしょう。しかし、エンタープライズとなると、やはり主力はJavaで、いきなり無くなるなんてことはありえません。そうなると、フロントエンドのためにサーバのアーキテクチャを全て見直すというのは難しい。サーバサイドのAP製品が、HTML5機能をどの程度までサポートするかが重要だろう!!っと、こういった考えの人もいるのではないかと思います。

先日のJavaOneにて、WebSocketやServerSentEventsがJavaEE7でサポートすると公表されたわけですが、当然それをサポートした実装が十分に整っているとは言えません。どの程度サポートしているか、各製品の対応状況を見てみましょう。

WebLogic

私の知人が「2013年は秋、12.1.2からサポートされるって、中の人が!」って言ってました。ただ、ソースが今年の初めだったということもあり、本当にそうなるかは謎です。WebLogicはエンタープライズ製品ということもあり、OSSのように明確なロードマップが出てこないそうです。

実際のところは、10月にOracleが開く入場料2,000ドル以上もする、超玄人向けと噂されたあのイベントに行ってみないことにはわからないですね。いきなりアップデートで入ってくるらしいので、ウォッチしておかないといけません。

JBoss

コミュニティ版では既に実装されています。GA版については2013年11月リリースの分でサポートされると噂されていますが、実際にRedHat社のベンダーサポートを受けるには、その半年後になります。なので、現場で使えるのは来年になるのでしょう。

GlassFish

とっくに使えます。っというより、GlassFish7は、Java EE 7の参照実装です!これから実装されるであろうWebLogicやJBossのJava EE 7の使用感を確かめるなら、GlassFishを使うことになるでしょう。

Tomcat

もう既にサポートしているそうですが。すみません、ソースが見つかりません。本当にサポートしているのだろうか。。。Servletやjspの参照実装として活用されているとは聞いていますが、Java EEの参照実装ではなかったはずなので、わかりません。

Jetty

早い時期からサポートしていたそうですよ。ただし、Java EE 7の実装と同じではなさそうな感じですね。残念です。


っとまぁ、全く動かないという訳ではありませんが、ベンダーサポートを受けれる有名どころ製品は軒並み、来年が本格的な開始という感じになっております。2014年がHTML5元年という言葉も頷けますね。また、出てきてすぐということもあり、互換性面でも心配になります。サーバサイドの互換性はフロントエンドに比べたらあんまり重要じゃなかったりもしますが、サーバサイドがフロントエンド側の技術に追いつくのは、もう少し時間がかかるのかもしれませんね。

果たしてJavaでやるべきなのか?」っという議論もありますが、そのあたりは次章で。

2. インフラの設計が困難

これまでのHTTPベースの運用は、「ステートレスであることが前提」で設計をしていたのではないでしょうか。多少は混じりっけがあるものの、M/M/1モデルを前提に、負荷分散・信頼性向上のアプローチを行なっていたのではないかと思います。しかしWebSocketなどはそうもいかない。Socket.ioみたいなコントロールセッションとデータセッションを別で持ってしまう場合、ロードバランサーに色々仕込みが必要になってしまいます。業務システムだと生でAPを見せてしまっても良いですが、同時接続数が多いシステムだとそうもいかないですよね。

リスクが高いという理由でこのあたりを無視し続けるということは無いと思ってて、どこかのタイミングで、WebSocketやServerSentEventsの鉄板みたいなやり方が見つけられて、世の中に浸透するのかなぁと思います。別に新しい考え方を見つけようというわけではなく、FTPの負荷分散なんかは、残念なことに業務システムのようなレガシーな世界だとまだやってるところがあって、そういうところから負荷分散・信頼性向上アプローチ面でのノウハウが流入してくるかもしれません。そういえばFlexなんかも、似たようなことをやっていた気がします。

サーバ自体の設計面で言えば、「ステートレスなセッションとステートフルなセッションは、別のAPで処理する」という考え方は、守るべき必須の考え方でしょう。例えるなら、バッチ用途とオンライン用途を別にするようなものですね。そうしないと、とてもとても負荷分散のアーキテクチャ設計なんてできません。

で、このあたりを前提とすると、なんとなくですがApacheにステートフルなセッションを処理させるというのも違和感を感じますし、そもそもあまりステートフルなことをさせることを想定していない既存のサーバAPをそのまま使い続けるというのもすごく気持ち悪い。ステートフルなセッションだけは別のAP製品やテクノロジーを使って処理するというのが、お作法な気がしてきます。

そういえば先日、こんな製品が記事になってました。

Kaazing WebSocket Gateway

http://kaazing.com/products/kaazing-websocket-gateway

「Kaazingは、世界で唯一つのエンタープライズ向けWebSocketゲートウェイです。」っという、某掃除機を彷彿とさせる謳い文句についつい目を引かれてしまいました。

少しばかり目的が違っていますが、HP内の図にあるMessage BrokerとかTCP Serverと呼ばれるものがWebSocketの接続先だとするなら、WebSocketやServersentEventsは、こういった専用の技術を介して処理をさせるのが今後の主流になると予感させられますね。同じHTTPでも、テクノロジーとして別物として捉えるのが妥当なんでしょう。IPAの情報処理試験から「HTTPはステートレスなプロトコルである」という内容が削除される日も、そう遠くないのかもしれません。

3. 使いドコロがわからない

インターネットメディアとエンタープライズシステムは、技術的には似てても、UIデザインという面では課題も解決方法も違っているように思います。DB設計もそうですが、いたるところに業界のお作法みたいなのがいっぱい混じっています。現行のモノだけを見ていると、WebSocket/ServerEventの使いドコロがイマイチよくわかりません。

ただ、これは単に適用事例が少ないからだと思います。

スマートデバイスを業務システムで活用する場合、オフライン化とこういった通信技術はセットになると思ってて、実際に営業さんが使うシステムで活用しようとしているという声が聞こえてきます。スマートデバイスの出現で、今まで実現できなかった業務がシステムで行えるようになる。業務の新規開拓領域を中心に、こういった新しい技術が広がっていくのではないでしょうか。

ユーザから目に見える形でハードウェアの変化が再び大きくなった昨今、業務システムは部分的にこういった変化が起こると思ってて、それがまだ世の中に広がっていない現状だけを見ていると、「今がベスト」にしか見えないのでわからないのは当然だと思うんです。私が小学校の頃、まさかこんな携帯電話を持ち歩く日が来るだなんて思ってもいませんでしたし(笑)

つまり何が言いたいのかというと、HTML5教の外の人間からは「使い道がわからない」と言われて理解すらされようとしない可哀想なWebSocketですが、基幹システムですらWeb技術中心になり、スマートデバイスの業務システム活用が広がる最近の技術革新の事情を鑑みるに、"今"だけを見て「使い道なんて無いだろう」と言い切るのは、早計ではないかと思うんです。「WebSocketが正しい」とは言い切れないのですが、クライアント・サーバ間の通信のやりかたに、多少なりとも変化が起こるのではないかと感じています。

こんな感じで課題は山積していますが・・・

HTML5が、システムのアーキテクチャデザインにインパクトを与え、新しい考え方が必要とされてくるのは間違いないので、将来どんなアイデアが生まれるのか、私は楽しみで仕方ありません。

もしかしたら、WebSocketよりももっと斬新で新しい考え方が生まれて、2〜3年後にはそれすらも飲み込むかもしれない!エンタープライズ系システムのライフサイクルから見ると「勘弁してくれ!」って感じですが、、、個人的な想いとしては、技術革新は歓迎されもっと広がるべきだと思っていますので「ガンガン行こうぜ」って感じで見守ろうと思います(笑)