DeveloperSummit2012 1日目(2/16) レポート その3

【16-A-5】node.jsテクノロジースタック for ソーシャルアプリケーション Robert J. Gould 氏 / 久富木 隆一 氏

  • node.js
    • Mobile
    • Global
  • node.js
言語 速さ
アセンブラ 1.0
c++ 1.21
java 1.76
JS 4.85
Ruby 43.79
Python 52.17
PHP 54.8
Perl 57.75
    • >node --strict
    • module node-browerify
    • >require('assert')
    • 非同期フロー管理(node-seq)
    • Long Stack trace(long-stack-traces)
    • console.errorなどをファイルにダンプ
    • try/catch on async call stacks(node-gree)
  • mobile
    • リアルタイムクライアント == WebSockets
    • WebSocket + node.js == Socket.io
    • WebSocketをサポートしないプラットフォームもあるが、Socket.ioをAjaxで対応
    • 但し、リアルタイムパフォーマンスが犠牲に
    • WebSocketがないなら、自前で実装するしか。。
  • モバイルネットワークは低速。低帯域で、高レイテンシ
    • クライアントへのコンテンツダウンロードは時間がかかる
    • →HTML5(WebStorage)を利用する
  • WebStorage!
    • CSS、画像、HTMLテンプレートその他コンテンツをWebStorage,WebSQLAPIを用いてローカルデバイスに保存
    • WebStorageがないブラウザは自前で実装
  • Global
    • node.jsの長所と短所
    • Node.jsはまだ進化中
    • I/Oと大量データ処理アプリケーションに強い
    • シングルスレッドで、CPUを使うタスクに弱い
    • CPUリソースは節約が望ましい
    • できるだけ結果をキャッシュ
  • HTMLテンプレートレンダリングやコンテンツのローカライズは、サーバのCPU資源を浪費
    • CPUを使うタスクはNode.jsに向かない
    • そこでタスクはクライアントへ移譲
    • クライアントはすでにコンテンツをロカールにもっているためWebSocketを使ってJSONで転送
  • 単一Node.jsサーバ作成は簡単
    • スケールするには?
      • クラスターモジュールを使う(cluster)
      • Clusterモジュールによるプロセスをフォークできる。マルチコアへの対応
      • マルチサーバの場合は、redisを利用
  • Redis
    • RedisはKVSというよりデータ構造の高パフォーマンスストレージシステム
    • ディスクのバックアップ&リカバリ機能はまだ不安定なのでMySQLに保存
    • Value,Atomic,Swap、Strings,Lists,Sets,Hashs,Rankings,PubSub
  • サーバ間バスでの通信をNode.jsイベント通信並に簡略化
    • WebSocketとRefisのPubSubを使って融合している
  • データのルールをアプリケーションレベルに集約できてミスや不整合を防ぎやすい
    • データベースにはカスタムDSLによりアクセス(クエリを自動生成)
    • APIを整理すれば非同期コードは難しくない(GREEではAPIを拡張している)
    • MySQL,MongoDB,Redisバックエンドを同一APIで利用可能、DSLによる手描きSQLを排除。
    • 結果は透過的にキャッシュされて高速に応答、DBにも保存してデータの永続化
    • REST APIでレガシーコードをラップして結果をキャッシュ