Upload
-
View
633
Download
0
Embed Size (px)
DESCRIPTION
SmartFXでのsocket.io活用事例
Citation preview
SmartFX でのSocket.IO 活用事例
株式会社みんかぶ 森田剛志@takeshy
アジェンダ SmartFX について Socket.IO を使った実装
Socket.IO の実装で考慮したこと Socket.IO-ReqEv について
Socket.IO サーバの運用 冗長化と負荷分散 デプロイ時における停止
SmartFX について
どんなサイト ?
みんかぶが提供するスマホ向け無料 FX 情報サイト。ニュース、チャート、予想が見れたり、バーチャルトレードができます。
Socket.IO と Backbone.js を使ってリアルタイムな SinglePageApplication を構築しています。
http://smartfx.jp( 正式には http://smartfx.minkabu.jp)
Socket.IO を使った実装
Socket.IO の実装で考慮したこと
Socket.IO は Socket を制御するための NameSpace 、 Rooms 、Events という便利な機能があります。
ただ、これらの機能は各々が代替できるので方針を決めて使わないと、まちまちになってしまいます。
そこで SmartFX はルールを決めました
SmartFX におけるNameSpace,Rooms,Events
のルール NameSpace とオブジェクトは 1 対 1
の関係で作成する
Room はイベント毎に作成する イベントが発生した場合は Room を使っ
て送信する
Eventは” message”,”reply”,”error” の3 つ “message” はクライアントからサーバに”
reply”,”error” はサーバからクライアントに送る時に使う
Socket.IO-ReqEv
これらの約束を適用することでSocket.IO 関連の処理が共通化されたので、くくりだし Middleware にすることができました
その Middleware が Socket.IO-ReqEvです
インストールは下記のコマンドですnpm install socket.io-reqev
Socket.IO-ReqEv の使い方 サーバー側
Socket.IO-ReqEv を使う 2 つの STEP1. Socket.IO オブジェクトを初期値として渡して IOReqEv オブジェクトを生成2. IOReqEv オブジェクトにパラメータとして、NameSpace と規約にのっとったオブジェクトを渡します。この例ではひとつだけの登録ですが、ペアを何個も登録可能。
Socke.IO-ReqEv に渡すオブジェクトの規約は下記の 3 つです。
1. events という Array のプロパティにクライアントに送るイベント名を登録する。2. EventEmitter を継承して、イベントが発生した場合はデータと共にイベントを emit する3. クライアントからのメッセージに requests というパラメータが含まれていた場合に呼び出されるメソッド request を実装する。(Like HTTP GET)左記のサンプルは 1 秒および 1 分ごとのイベントと現在時間を返すためのプログラムです。
Socket.IO-ReqEv の使い方 クライアント側
Socket.IO-Reqev をブラウザで使う 2 つの STEP1. Socket.IO サーバアドレス +Path(NameSpace) と、
callback を渡して IOReqEvClient を作ります。2. watch メソッドで subscribe したいイベントとリク
エストの種別を指定します。events に違うイベントを指定して再度 watch を実行すると、サーバ側でもう必要なくなったイベントの unsubscribe 処理が行われます
Socket.IO-ReqEv の実装
サーバ側は 60 行もないソース Socket.IO 0.9.x の頃は非公開の属
性を使っていましたが、 1.0 になって公開されている属性のみになりました
興味がある人は読んでhttps://github.com/takeshy/socket.io-reqev
Socket.IO サーバの運用
システム構成
冗長化と負荷分散 冗長化と負荷分散は、 Socket.IO サー
バが DB に登録された自分の情報を定期的更新し、 Web サーバが最近更新された Socket.IO サーバのアドレス一覧からランダムにアドレスを選んでそのアドレスをクライアントに伝えることで実現しています。
冗長化と負荷分散シーケンス
デプロイ時における停止 pm2 という Node.js のプログラムのデーモ
ン管理ツールを使っていますが、 Shutdown しようと delete コマンドを実行しても、 Socket.IO のようなネットワークコネクションがはりっぱなしの場合、いつまでも delete コマンドが完了しません。
そのため、 Socket.IO サーバ自身がShutdown する仕組みを作りました。
Deploy の流れ 対象 Socket.IO サーバのアプリのソースを更新し、 pm2 の
delete と start を実行するスクリプトの実行 (by capistrano)
DB 上の該当 Socket.IO サーバのレコードの status を inactive
Socket.IO サーバは自身のレコードが inactive になったことを検知すると、 Clients に inactive イベントを Braodcast して、1 分後に自身を exit するタイマーを実行
inactive イベントを受信したクライアントは、もし 1 分間以上同じページに留まったいた場合は接続が切断された旨の popup を出力 ( ページ更新した場合は新たな socket.io サーバのアドレスを取得できるため問題なし )
DB 上の該当 Socket.IO サーバのレコードの status を active
Socket.IO サーバ停止シーケンス
ご静聴ありがとうございました