Lakshan Perera「Real-time Collaborative Editing with Web Sockets, Node.js & Redis」
リアルタイムコラボレーションできるエディタ作ってるLakTEKの2010.5.25のエントリ
Node.js人気
非同期通信の実装はNode.jsいいよ(せっせと作ったRailsのコード捨てたよ)、と
真のリアルタイムウェブやりたいからWeb Sockets使うよ、と
DBはRedis使うよ、と
Real-time Collaborative Editing with Web Sockets, Node.js & Redis
リアルタイムでのコラボレーションツールrealieを作ってる人が、サーバーサイドの実装をRubyからJavascript(Node.js)に変更したことをアナウンスしてる。
※Realieのデモ動画
以下斜め読んだ内容
- Realieはプロジェクトとしては数ヶ月前にスタート、大学内での個人プロジェクトとしてやってる
- Real Time Webがプロジェクトの研究テーマ
- 現時点のRealieで提供できる機能
- 他人のファイル編集を見る/共同作業者とチャット/編集のプレイバック
- ゴールは、コラボレーションしながら編集できるコードエディタ
- シンタックスハイライト、SCMインテグレーションは当然実装
- web sockets採用
- ここがRealieの独自性(Etherpad/Google Docs/Waveと比べて)
- web socketsはリアルタイムコラボレーションにぴったり
- 非同期接続、全二重(full-duplex)な通信が必要だから
- 代替手段(long-polling/comet)よりもweb socketsの方が効率性も信頼性も高い
- 通常のHTTP通信では、メッセージにヘッダが必ず必要
- web socketsでは一度クライアント/サーバ間にハンドシェイク(handshake)が成立すれば、最低限のオーバーヘッドだけでメッセージをやり取りできる
- パフォーマンス向上する(帯域利用を大幅にカットできるから)
- おさらい:web socketsのサポート状況
- おさらい:リアルタイム編集のときに起こること
- ユーザが変更
- 差分がサーバーへ送信
- サーバーで受信した差分が作業中のファイルへマージ
- 別のユーザは差分を受け取り、作業中のコンテンツが勝手に更新される
- 差分のうけとりとパッチの適用はクライアント側で起こる
- 差分の受け取りとパッチの適用のハンドリング自体は、Neil Fraserがライブラリ作ったので楽になった
- 差分のうけとりとパッチの適用を同時に実行したいときどうするか
- 通常のクライアントサイドの処理はシングルスレッド。そのため処理は遅い同期処理になる
- これを解決するために色々試した
- Web Workers API(HTML5)を試してみた
- WebKitとFxで実装済
- バックグラウンド処理が出来るようになる。mainスクリプトとworkerスクリプトの二本立てスレッドになる
- 速くなるが色々まだやることが多かった
- サーバーの実装は最初はRailsでやってた
- しばらくNode.jsで遊んでみた
- 自分がやってるプロジェクトにNode.jsは向いてると感じるようになった
- Node.jsはjsでおなじみのイベントドリブンモデルをサーバーサイドで実現しており、それによって柔軟になってる
- Node.jsではV8エンジンが使われててこれがとても速い
- 今まで作ったRubyのコードは捨て、Node.jsで行くことにした
- バックエンドは通常のHTTP部分と、web socket部分の2つ
- 通常のHTTP部分の実装は、Node.jsのフレームワークExpressを使った
- Sinatraと同じアイディアで設計されているのでRubyやってる自分としては導入が楽チン
- web socketの実装では、Michael Smithが最近リリースしたNode.js用のweb socket server module
- Node.jsでのweb socket実装については前にエントリ書いた
- pad(Realieの編集画面)上で行き来するメッセージ
- 種類がいろいろ
- ユーザがpadに参加、ユーザがpadから離れた、ユーザが差分送信、ユーザがチャットメッセージを送信
- pad上で行き来するメッセージののハンドリングに、Redisのpub/sub implementationを使った。
- 永続型ストアとしてredisを使うことのメリット
- おさらい:redisはkey/value型データベース
- redisはメモリ上のデータへのアクセスが早い
- 一定インターバルでデータをディスクへ書き込む
- 異なるデータ形式をredisはサポートしてる。
- Realieではスナップショットはstring型に、差分・チャットメッセージ、ユーザは、リスト型にしてる
- Node.js用のredis clientもある