Node.jsに強烈に個性的な「SocketStream」が登場!
また1つ、Node.jsベースのWebアプリケーションフレームワーク「SocketStream」が登場しました。6月23日にロンドンで開催されたHacker Newsのミートアップで発表されたようです(@makoto_inoueさん、情報提供ありがとうございます!)。GitHubのレポジトリにはバージョン0.1のソースコードと、何ができるかというサンプルコードを含む長大なドキュメントが公開されています。
このSocketStreamは、単にまたNode.jsでWebアプリケーションフレームワークが1つ増えたという感じではないようです。従来のものとは、設計がドラスティックに異なっています。
まず、名前から自明なように、WebSocketを基本としていて、SPA(Single Page Application)が作りやすいように設計されています。SPAとは、1ページのHTMLを読み込んだら、後はAjaxでデータのチャンクをサーバからもらうタイプのWebアプリケーションのことで、Twitterが典型です。Twitterはヘルプや設定などを除いて、大部分のアクションは同じ1ページのHTMLが次々と書き換わるという設計になっていますよね。
1ページのHTMLで作るSPAは、ページ書き換えが一部分であるため体感速度が早いわけですが、それでも現在の多くのAjaxを使ったWebアプリは、HTTPを使ってデータをやり取りしています。つまり、セッションが切れてる場合はハンドシェークがあるほか、毎回HTTPヘッダの送受信というオーバーヘッドがあるわけです。これがWebSocketでサーバとブラウザ間に双方向の通信経路が常時確立されるようになれば、相当スピードアップするはずで、また一歩、Webアプリがネイティブアプリとのギャップを埋めることになりそうです。SocketStreamでは、全てのデータはJSONにシリアライズしてやり取りされるようです。
SocketStreamは応答速度にこだわっているようで、サーバ側のストレージには、インメモリのKVS「Redis」を使っています。RedisはCで書かれた高速なKVSですね。非同期の永続化やレプリケーションにも対応した変わり種(?)で、ハッシュやリスト、集合などのデータ構造、アトミックな加算ができる数値型、コレクション同士のちょっとした集合演算などができる高機能KVSでもあります。小さなデータをガンガンやり取りするWebアプリだと、応答性が良くなりそうですよね。StreamSocketの開発者たちは「Crazy fast!」(狂ったように速い!)と強調しています。
●サーバもクライアントもCoffeeScript
SocketStreamがフレームワークとして面白いのは、サーバ側のコードと、クライアント側のコードの連携を、人間にとって分かりやすいAPIとしてまとめていることです。まず、両サイドともCoffeeScript(JavaScriptへコンパイルすることを前提とした言語)を使います(FAQを見ると、ほかの言語のサポート予定はないようです。この辺、opinionatedな匂いがします)。そして、ちょうどjQueryに「$」のように「SS」というグローバル変数を名前空間として、クライアント側からサーバ側のメソッドが呼べるかのようなAPIになっています。
例えば、サーバ側のコードとして、/app/server/app.coffeeに、
exports.actions =
square: (number, cb) ->
cb(number * number)
などと書いておき、クライアント側のコードとして、/app/client/app.coffeeに、
exports.square = (number) ->
SS.server.app.square number, (response) ->
console.log "#{number} squared is #{response}"
と書けば、クライアントからサーバのメソッドを呼び出すかのように結果を持って来られるようです。クライアントのコードやHTML、CSSはサーバ側からブラウザに送られる際には、minifyやパッケージ化など自動で行われます。SocketStreamでは、これらのファイルに変更があると、
- CoffeeScript
- Uglyfi.JS(minifyするライブラリ)
- Jade(HAMLのようなHTMLテンプレートエンジン)
- Stylus(SASSのようなCSSプリプロセッサ)
などをキックして、ブラウザに送り出してくれるようです。
SocketStreamは、まだ実験的な実装で、今後は複数CPUコアを活かしきる機能追加によってスケールアップ性能を上げることも検討しているといいます。ただし、Node.jsなので、2000~3000クライアントの同時接続ぐらいなら、すでに全く問題ないということですが。
フルスタックのWebフレームワークだと言っていますが、SocketStreamは、いわゆるモデルを簡単に扱う仕組みはありません。スムーズな同時接続数を主眼としているだけあって、Userモデルが組み込みだったり、認証機構も用意されているようですが、ガンガンCRUDでモデルを作りたいという用途だと、ちょっと面倒かもねとFAQには書いてあります。ただ、これについては、「Real Time Model」という仕組みを内部的にテストしている最中で、期待して待っててねということだそうです。Real Time Modelとはずいぶん思わせぶりな命名ですが、どんなものが出てくるのか、ちょっと楽しみですね。