Webアプリ関連の技術で最近面白そうなことと言えばPush関連でしょうか。Pushを利用するアプリの代表と言えばチャットですが、昔のWebチャットと言えば、ブラウザのリロードを繰り返す仕組みで、リアルタイムとは言えないものでした。もっと昔のパソコン通信時代には当たり前のようにできていたことが、Webではできなかったのです。そんな、かつて不可能だったリアルタイムのサーバーPushが、今では簡単に実現できるようになっています。

node.jsが話題になってしばらく経つけど、これで何作るかネタが思いつかなかったのと、新たにサーバーサイドJavaScriptとかやりたくない、Railsだけを使いたいんだ。と頭が凝り固まって放置していました。

そんなわけでちょっと乗り遅れていますが、そろそろPush技術を利用したアプリを何か作ってみたい。と思って、今試しているのがJuggernautです。Node.jsを使いつつサーバーサイド(Node.jsサーバに対するクライアント)はRubyが使えます。

WebSocket、Flash Socket、Comet、Polingなどに対応していて、ブラウザによって使えるプロトコルでPushしてくれるようです。なので古いIEから最新のiPhoneまで対応しているようです。

基本的な使い方が簡単すぎてワロタ。

まずサーバとしてJuggernautサーバ(node.js)と、key-value storeのRedisを起動しておきます。

$ redis-server %
$ juggenaut % 

そしてコーディング。まずはクライアント側。こんなコードで待機。

<script type="text/javascript">
var jug = new Juggernaut;
jug.subscribe("ch001", function(data){
alert("きた! : " + data);
});
</script>

サーバ側。こんな感じでデータを送る。(例えばチャットだったら誰かがメッセージをPOSTしてきたタイミングでクライアントにデータを送る)

require "juggernaut"
Juggernaut.publish("ch001", "おりゃ!")

これだけでサーバ側から送られてくるイベントに対して遅延なくリアルタイムにアクションを起こすことができます。

もうこの段階ですでにちょっと感動。かつては不可能だったことがこんなに簡単に実現できるようになっています。

 

従来のWebでは、クライアントはサーバとしか通信することができないので、利用者間でやりとりをするためには、送りたい情報を一旦サーバ上のDBなどに保存しておき、もう一方の利用者がそのデータを参照する。という設計スタイルでした。

Pushが使えると、情報を宛先と共に送れば、そのまますぐに相手に届きます。クライアント側のJavaScriptプログラムでは、データを受けた時のイベントハンドラを書いておく、イベントドリブンの設計ができます。

これはWebの制約を打ち破るパラダイムシフトだと思います。この技術を活用したサービスや製品が、これからもっと沢山登場してくることでしょう。