@thorikiriのてょりっき

@thorikiriがWebとかAndroidとかの技術ネタや本を読んだブログです

東京Node学園 9時限目 #tng9 に行って来ました

色々あって勉強会に出るのも久しぶりな気がします。
だいぶ遅くなりましたが、資料がアップされて下書きしていたのを思い出したので、メモを投下しておきます。


TV視聴参加型システムを支える伸縮可能型Socket.IOクラスタの裏側

資料 → TV視聴参加型システムを支える Socket.IOクラスタの裏側 // Speaker Deck

  • MIESとは
    • http://www.bascule-go.com/product/
    • ダブルスクリーン視聴によるテレビ番組への参加体験を提供する
    • スマートフォンの操作が連動する
    • テレビを見ながら、テレビとスマフォが連携する、それがテレビに表示される
    • BloodyTube
      • テレビの中のゲームに参加出来る
      • ポイントは実店舗で利用できる
    • これの裏側でMIESが動いている
  • リアルタイムメッセージングシステム
    • 要件
      • リアルタイムに友達の情報を共通したい
      • ブロードキャスト配信したい
      • 1つの案件ではなく、色々と使えるように汎用性を持たせたい
      • クロスブラウザ
      • なるべく安く
      • スケール、番組は1時間くらいだから、20万ユーザくらいはよろしくね。
    • Socket.IO
      • マルチトランスポート
    • 問題点
      • 2回アクセス問題
      • スケールアウト、RedisStore
      • プロキシで対応する
      • 独自ノード管理する これを採用した
    • 何が出来るの?
  • ソケット接続確立まで
    • 一度コンシューマで認証してから、APIサーバに認証しにいく。
    • 接続先を返してもらって、そこからソケットサーバを見に行く。
  • メッセージ配信
    • ユーザAがAPIを叩くと、APIサーバがソケットサーバへ
    • ソケットサーバから別のユーザにプッシュする
  • メッセージ配信
    • コンシューマからAPIを叩く
    • APIサーバから、ソケットサーバ群にブロードキャストし、ソケットサーバがプッシュする
    • ソケットサーバ間もSocket.IOで接続する
      • パフォーマンスが良くなった。でも問題もある。
  • ノード管理
    • バッチでソケットサーバ群を監視している。その情報をDBに入れている
    • APIサーバはDBを参照して、どこに繋げれば良いかを判定する
    • ノード追加
      • 死んだら、DBを更新する、更新されたら、APIサーバは別のところにつなげるようにする
  • サーバTips
    • 特定のノードに偏らないように、ノード毎に重み付けを保持する
    • Socket.IOのコネクションの数により決定する
    • github node-sio ...
      • Socket.IOのパラメータ調整
      • reconnect_failedのバグがある
  • さらなるステップ
    • 実績
      • 同時20万ユーザ接続。テストですけど。今の構成で2倍3倍はいけそうです。
    • 100万超えを目指したい。
    • そのために
      • APIサーバとソケットサーバの結合度を下げる
      • 間にリレーサーバを挟む
      • ジョブキュー
      • Amazon SNS
      • データストア
      • Twemproxy+Redis
      • Riakを検討
  • 1台あたりの接続数を上げるための施策
    • Cluster化を採用する
    • あるいはSocket.IOをやめる
      • Sock.js ただし、レイヤーが違うっぽいので、
      • Engine.io
  • まとめ
    • TVとスマフォがリアルタイムに連動するプラットフォーム
    • Socket.IOでも十分に大量の接続が捌ける が 工夫は必要
    • リアルタイムによる弊害を認識しておく
      • アクセスが集中しない工夫
      • ソケットが繋がらなかったクライアントも救う手段を用意しておく

Co-Meeting のリアルタイム Web プラクティス

co-meeting | リアルタイムコラボレーションツール

  • co-meeting
    • チームの全てを共有するリアルタイムコミュニケーションシステム
  • CROWY
  • co-meeting
    • リアルタイムな掲示板みたいなもの
    • Evernoteがリアルタイムになった感じのもの
    • インプット→まるまる→アウトプット
      • GithubのIssueとか
      • PivotalのTrackerのストーリー
      • BasecompのTodo
      • Redmineのチケットなど
  • 実装について
  • stunnel-haproxy で接続
    • リアルタイム意外の部分はRails
    • Jetty上でSocket.IO-Javaで実装している。ApacheWaveでチャットを使っている。
      • その関係でJavaで実装している
    • 画像系はAmazon S3
    • アプリケーションデータはMongoDB
    • RailsとのデータやりとりはRedis
    • OCFS2+iSCSI
  • Apache Wave
    • Google Waveが前身です
      • 2009年9月プレビューリリース:リファレンス実装
      • 2010年5月 正式リリース(Google.IO)
      • 8月 クローズ宣言:Wave in a Box , work around
      • 2012年3月閉鎖:Apacheプロジェクト
  • waveプロトコル
    • 一文字一文字送信して、返す。
    • チューニングポイントでもある。
    • JSONでやりとりする。Wave GWTでHTMLをレンダリング
    • Jettyで受けて、Socket.ioからWaveサーバにいく。そこからProtcolBufferで。
    • WebSocket, XHR-PollingをSocket.ioで吸収する。
  • Socket.io-java
    • Socket.ioのプロトコルJavaサーバー実装
    • Socket.ioの機能が利用できる
    • ただし、あんまり使っている人が居ない。
      • バグが多い、対応しているバージョンが古い
      • 本家がどこかわからない
      • 無いよりましな程度でしか使えない
  • 改修ポイント
    • Socket.io-javaは1人コケると全員アウト!
      • そこは非同期で吸収して、1個1個送るように修正しました。
    • レスポンスが帰ってこないと次が送らない
      • 競合の整合性を担保するためのもの
      • レスポンスのバージョンをあわせないといけない
      • 今は、ポップアップでアラートするにとどまっている
  • インフラとしてのJava
    • メモリ管理リツールや、ノウハウが豊富
  • Ruby on Rails + Apache Wave
    • ユーザ管理とか、普通の画面はJavaで実装する必要はない
    • Railsは何でも揃っているから、色々と頑張らなくてもよい
      • コアな部分にリソースを投入出来る
    • セッション情報は、Redisに登録する(RailsのセッションIDを使う)
    • Socket.io接続後、認証をリクエストする
  • RailsのPubsub
    • Rails側からPublishして、SubcribeでJetty側に通知して、ユーザにプッシュする、ユーザがRails側から取りに行く。

LT

Node.js + Unity
  • Unity
    • 3Dゲームの開発ツールゲームエンジン
    • iOS,Android,デスクトップ向けが作れる
    • ゲームに限らず、3Dでやりたい場合には、Unityを使えばいいとおもう。
    • unity <-> node <-> smartphone
"Yeomanでtmlib.jsのゲームを量産する"話
  • tmlib
    • Time is Maney Library
    • ゲーム用のライブラリ
    • b-rogue
      • これもtmlibで作られている
  • 今、tmlibとsocket.ioでゲームを作っている。
    • YomanでScaffoldのツールを作って、やっています。
    • Yoman1.0で、yoって言うものになっています。
      • Gruntとかそのまま使えたほうが良いから。
    • Express
      • Scaffoldだけでこれが出来上がる
第1回 納涼もんご祭り
  • http://mongodb.jp/mongo/noryo2013/top*title
  • 7/28 東工大蔵前会館 参加費無料
  • 隅田川の花火の翌日です。いつきてもいいですよ。
  • 懇親会もあります。渋谷のイカセンターでやっています。
  • スタッフも募集しています。