WebSocketアプリのモデルを考える
ども。
Salesforce Hackチャレンジに参加していたQuizarは安定の選外でした。。。
ま、Salesforce1まったく関係なかったから無理もない。(^^;
さて、それはさておきQuizarの製作を通してWebSocketを使えば今まで世の中に存在しなかったようなアプリを作れる可能性があるということを実感したわけですが、現実にはほとんどWebSocketアプリは開発されていません。
こうした状況の最大の原因は世の中にWebSocketアプリ開発のためのモデルやフレームワークがほとんど存在しないためだと思っています。
現状では低レベルのAPIだけはあるものの、それしかないからその上のモノは全部自分で作らないといけないわけです。
Quizarの開発過程でやったことだけでも、メッセージのルーティング、リクエスト/レスポンスの対応付けなど通常のWeb開発ではやらないようなプログラミングをかなり行っています。
状況としてはhttp/1.0の頃にServlet APIだけで開発していた極初期のWebアプリ開発に近いかな?
あるいは、ひと固まりのメッセージがあるだけでそこに何の付帯情報もないということを考えると生ソケットで直接メッセージを読み書きしている状況に近いという気も。(^^;
いずれにせよこの状態から一本のアプリを作り上げるのは結構な労力なわけで、逆に言えば、になんらかのモデルとフレームワークがあればWebSocketアプリ開発のハードルは一気に下がる気がします。
いくつかのアプリ開発を通してなんとなくその形が見えてきはじめているので、今回はそれをざっくりまとめてみます。
★ モデル
多分WebSocketアプリのモデルはほとんどすべてルームモデルに収まります。
「ルームモデル」という言葉は小西の造語ですが、とりあえず以下のように定義します
- アプリ空間に複数のルームがあり、
- ルームには複数の人が入室でき、
- ルーム内にいる人同士がリアルタイムにコラボレーションできるアプリケーション
シンプルな定義ですが、それだけにほとんどのWebSocketアプリはこのモデルにあてはまるはずです。
Quizarは典型的なルームモデルアプリケーションですが、ルームの中にいるのはクイズの出題者と回答者という役割の違う2種類の人達です。
このようにルームに入室した各人の役割は複数あり得るので
- ルーム内にはロールの異なる複数の人が存在して良い
というのも定義に加えて良いかもしれません。
★ フレームワークに必要な機能
次にルームモデルアプリケーションを作成するために必要な機能を考えてみます。
サーバー側にルームを管理する機能が必要なのはもちろんですが、最低限メッセージのフォーマットを決めておかないとリクエストのハンドリングもままなりません。
また、クライアント側も必然的にSPA(Single Page Application)となるのでWebSocket以外にも多くの機能が欲しくなります。
ここではとりあえずメッセージ、サーバー、クライアントの3つにわけて必要と思われる機能を列挙してみます。(細かく説明し始めるとあまりにも長くなりそうなので。。。)
ちなみにこのリストもQuizarの開発経験からの逆引きです。
● メッセージ
- JSON形式のエンベロープとする
- リクエスト毎にIDを持つ
- リクエストのコマンドが識別できる
- 任意複数のパラメータが渡せる
- レスポンスのエラーが識別できる
- JSON、HTML、Textなど複数の形式のレスポンスを返すことができる
● サーバー
- 複数のWebSocket接続を束ねるルームを持つ
- ルームの永続化(RDB等へのルーム情報の保存)機能は範囲外
- スケールアウトするための外部のPub/Sub機能を利用できる
- ルーム内ユーザーへのメッセージブロードキャスト
- ブロードキャストメッセージのフィルタリング
- メッセージのルーティング
- メッセージのロギング
外部のPub/Subは今のところRedis以外に知りませんが、差し替えられるように抽象化はした方が良さそうです。
● クライアント
クライアント側ではルームモデルに限らずSPA全般で必要となる機能も含みますが、それぞれの機能は独立して使えるモノとします。
- WebSocketをAjaxライクに使用できる(リクエストに対応するレスポンスを取得できる)
- メッセージのエラーハンドリング
- リクエストにひもづかないメッセージのルーティング
- サーバーサイドからの切断時の再接続
- アイドル状態の識別とイベントハンドリング
- プラグイン可能なデバッグログ
- ポーリング
- WebStorageでのテンプレート管理
- PushState対応
サーバーとの通信はAjax併用でも良いんですが、多分全部WebSocketでやる方がシンプルだし速度面やセキュリティ面でも優位があります。(これはそのうち別に書きます。)
逆に面倒な部分としては切断時の対応とデバッグ(ブラウザのWebコンソールでメッセージを見ることができない)があるんですが、これらをうまくフレームワーク側で吸収できればメリットだけを享受することもできるはずです。
□□□□
とりあえず、こんなところでしょうか。
なんか忘れてる気もしますが、まぁそれはおいおい(^^;
実際にはQuizar開発当初からフレームワーク化を意識していたので、上に書いた内容は概ね実装イメージがあります。(もちろんブラッシュアップや再考が必要な部分も多々ありますが。。。)
サーバーサイドはWebSocketとRedisのPub/Subが使えれば何でも良いんですが、とりあえずPlayで。(他でも作るとしたら多分次はNode.js)
というわけで、6月末を目途にフレームワークとなんか適当なルームモデルアプリを作ります。(^^v