20
SmartFX でで Socket.IO でででで でででででででで でででで @takeshy

Smart fxでのsocketio活用事例

  • Upload
    -

  • View
    633

  • Download
    0

Embed Size (px)

DESCRIPTION

SmartFXでのsocket.io活用事例

Citation preview

Page 1: Smart fxでのsocketio活用事例

SmartFX でのSocket.IO 活用事例

株式会社みんかぶ 森田剛志@takeshy

Page 2: Smart fxでのsocketio活用事例

アジェンダ SmartFX について Socket.IO を使った実装

Socket.IO の実装で考慮したこと Socket.IO-ReqEv について

Socket.IO サーバの運用 冗長化と負荷分散 デプロイ時における停止

Page 3: Smart fxでのsocketio活用事例

SmartFX について

Page 4: Smart fxでのsocketio活用事例

どんなサイト ?

みんかぶが提供するスマホ向け無料 FX 情報サイト。ニュース、チャート、予想が見れたり、バーチャルトレードができます。

Socket.IO と Backbone.js を使ってリアルタイムな SinglePageApplication を構築しています。

http://smartfx.jp( 正式には http://smartfx.minkabu.jp)

Page 5: Smart fxでのsocketio活用事例

Socket.IO を使った実装

Page 6: Smart fxでのsocketio活用事例

Socket.IO の実装で考慮したこと

Socket.IO は Socket を制御するための NameSpace 、 Rooms 、Events という便利な機能があります。

ただ、これらの機能は各々が代替できるので方針を決めて使わないと、まちまちになってしまいます。

そこで SmartFX はルールを決めました

Page 7: Smart fxでのsocketio活用事例

SmartFX におけるNameSpace,Rooms,Events

のルール NameSpace とオブジェクトは 1 対 1

の関係で作成する

Room はイベント毎に作成する イベントが発生した場合は Room を使っ

て送信する

Eventは” message”,”reply”,”error” の3 つ “message” はクライアントからサーバに”

reply”,”error” はサーバからクライアントに送る時に使う

Page 8: Smart fxでのsocketio活用事例

Socket.IO-ReqEv

これらの約束を適用することでSocket.IO 関連の処理が共通化されたので、くくりだし Middleware にすることができました

その Middleware が Socket.IO-ReqEvです

インストールは下記のコマンドですnpm install socket.io-reqev

Page 9: Smart fxでのsocketio活用事例

Socket.IO-ReqEv の使い方 サーバー側

Socket.IO-ReqEv を使う 2 つの STEP1. Socket.IO オブジェクトを初期値として渡して IOReqEv オブジェクトを生成2. IOReqEv オブジェクトにパラメータとして、NameSpace と規約にのっとったオブジェクトを渡します。この例ではひとつだけの登録ですが、ペアを何個も登録可能。

Page 10: Smart fxでのsocketio活用事例

Socke.IO-ReqEv に渡すオブジェクトの規約は下記の 3 つです。

1. events という Array のプロパティにクライアントに送るイベント名を登録する。2. EventEmitter を継承して、イベントが発生した場合はデータと共にイベントを emit する3. クライアントからのメッセージに requests というパラメータが含まれていた場合に呼び出されるメソッド request を実装する。(Like HTTP GET)左記のサンプルは 1 秒および 1 分ごとのイベントと現在時間を返すためのプログラムです。

Page 11: Smart fxでのsocketio活用事例

Socket.IO-ReqEv の使い方 クライアント側

Socket.IO-Reqev をブラウザで使う 2 つの STEP1. Socket.IO サーバアドレス +Path(NameSpace) と、

callback を渡して IOReqEvClient を作ります。2. watch メソッドで subscribe したいイベントとリク

エストの種別を指定します。events に違うイベントを指定して再度 watch を実行すると、サーバ側でもう必要なくなったイベントの unsubscribe 処理が行われます

Page 12: Smart fxでのsocketio活用事例

Socket.IO-ReqEv の実装

サーバ側は 60 行もないソース Socket.IO 0.9.x の頃は非公開の属

性を使っていましたが、 1.0 になって公開されている属性のみになりました

興味がある人は読んでhttps://github.com/takeshy/socket.io-reqev

Page 13: Smart fxでのsocketio活用事例

Socket.IO サーバの運用

Page 14: Smart fxでのsocketio活用事例

システム構成

Page 15: Smart fxでのsocketio活用事例

冗長化と負荷分散 冗長化と負荷分散は、 Socket.IO サー

バが DB に登録された自分の情報を定期的更新し、 Web サーバが最近更新された Socket.IO サーバのアドレス一覧からランダムにアドレスを選んでそのアドレスをクライアントに伝えることで実現しています。

Page 16: Smart fxでのsocketio活用事例

冗長化と負荷分散シーケンス

Page 17: Smart fxでのsocketio活用事例

デプロイ時における停止 pm2 という Node.js のプログラムのデーモ

ン管理ツールを使っていますが、 Shutdown しようと delete コマンドを実行しても、 Socket.IO のようなネットワークコネクションがはりっぱなしの場合、いつまでも delete コマンドが完了しません。

そのため、 Socket.IO サーバ自身がShutdown する仕組みを作りました。

Page 18: Smart fxでのsocketio活用事例

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

Page 19: Smart fxでのsocketio活用事例

Socket.IO サーバ停止シーケンス

Page 20: Smart fxでのsocketio活用事例

ご静聴ありがとうございました