以下斜め読んだ内容

pseudo translation of useful posts, book reviews, remarks,etc. twitter: feeddict

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のサポート状況
    • 実装済みブラウザはいまのところchromeのみ
    • Mozillaは対応予定
    • flashの通信機能を利用すれば他のブラウザで利用できること
  • おさらい:リアルタイム編集のときに起こること
    • ユーザが変更
    • 差分がサーバーへ送信
    • サーバーで受信した差分が作業中のファイルへマージ
    • 別のユーザは差分を受け取り、作業中のコンテンツが勝手に更新される
  • 差分のうけとりとパッチの適用はクライアント側で起こる
    • 差分の受け取りとパッチの適用のハンドリング自体は、Neil Fraserがライブラリ作ったので楽になった
  • 差分のうけとりとパッチの適用を同時に実行したいときどうするか
    • 通常のクライアントサイドの処理はシングルスレッド。そのため処理は遅い同期処理になる
    • これを解決するために色々試した
  • Web Workers APIHTML5)を試してみた
    • WebKitとFxで実装済
    • バックグラウンド処理が出来るようになる。mainスクリプトとworkerスクリプトの二本立てスレッドになる
    • 速くなるが色々まだやることが多かった
  • サーバーの実装は最初はRailsでやってた
    • Rubyが好きだから選んだし、経験もあった
    • 開発と途中からこの選択は良くなかったと思うようになった
    • 非同期処理をするアプリケーションにRubyは不向きだと感じるようになった
    • EventMachineは便利でRailsでの開発上の問題をある程度解消してくれた。
    • Railsを含めたRubyライブラリは同期処理を前提とした書かれ方をしてる
  • しばらくNode.jsで遊んでみた
    • 自分がやってるプロジェクトにNode.jsは向いてると感じるようになった
    • Node.jsはjsでおなじみのイベントドリブンモデルをサーバーサイドで実現しており、それによって柔軟になってる
    • Node.jsではV8エンジンが使われててこれがとても速い
    • 今まで作ったRubyのコードは捨て、Node.jsで行くことにした
  • バックエンドは通常のHTTP部分と、web socket部分の2つ
  • 通常のHTTP部分の実装は、Node.jsのフレームワークExpressを使った
  • pad(Realieの編集画面)上で行き来するメッセージ
    • 種類がいろいろ
    • ユーザがpadに参加、ユーザがpadから離れた、ユーザが差分送信、ユーザがチャットメッセージを送信
  • pad上で行き来するメッセージののハンドリングに、Redisのpub/sub implementationを使った。
    • ユーザ接続時は、redisインスタンスがユーザに対して2つ生成。1インスタンスはメッセージのパブリッシュ用、もう1つは登録してるチャンネルからのメッセージのキャッチに使われる。
  • 永続型ストアとしてredisを使うことのメリット
    • おさらい:redisはkey/value型データベース
    • redisはメモリ上のデータへのアクセスが早い
    • 一定インターバルでデータをディスクへ書き込む
    • 異なるデータ形式をredisはサポートしてる。
      • Realieではスナップショットはstring型に、差分・チャットメッセージ、ユーザは、リスト型にしてる
      • Node.js用のredis clientもある