SlideShare a Scribd company logo
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つのSTEP
1. 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つの
STEP
1. 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サーバ停止
シーケンス
ご静聴ありがとうご
ざいました

More Related Content

What's hot

Getting started with Handoff
Getting started with HandoffGetting started with Handoff
Getting started with Handoff
Yuichi Yoshida
 
Our Track to Modern Angular #2
Our Track to Modern Angular #2Our Track to Modern Angular #2
Our Track to Modern Angular #2
Yuta Shimizu
 
ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
ここにハマった!Dockerコンテナホスティング「Arukas」の裏側ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
Shuji Yamada
 
2010年インストールマニアックス ~Javaアプリ編~
2010年インストールマニアックス ~Javaアプリ編~2010年インストールマニアックス ~Javaアプリ編~
2010年インストールマニアックス ~Javaアプリ編~normalian
 
Riot.jsとフォームのデータバインディング
Riot.jsとフォームのデータバインディングRiot.jsとフォームのデータバインディング
Riot.jsとフォームのデータバインディング
Keisuke Imai
 
Face APIで開発する時に使っている7つの道具
Face APIで開発する時に使っている7つの道具Face APIで開発する時に使っている7つの道具
Face APIで開発する時に使っている7つの道具
Kazuyuki Miyake
 
現場!実物!実践!マルチクラスタを運用するときの課題とコツ
現場!実物!実践!マルチクラスタを運用するときの課題とコツ現場!実物!実践!マルチクラスタを運用するときの課題とコツ
現場!実物!実践!マルチクラスタを運用するときの課題とコツ
Shuji Yamada
 
Application Bootstrap
Application BootstrapApplication Bootstrap
Application Bootstrap
Takafumi ONAKA
 
Wolcome to swift
Wolcome to swiftWolcome to swift
Wolcome to swift
Kyohei Ito
 
スタートアップにjoinして1年間の変化を振り返る
スタートアップにjoinして1年間の変化を振り返るスタートアップにjoinして1年間の変化を振り返る
スタートアップにjoinして1年間の変化を振り返る
Masashi Ogawa
 
現実的な「WordPress on Azure App Service」 クイックスタート
現実的な「WordPress on Azure App Service」 クイックスタート現実的な「WordPress on Azure App Service」 クイックスタート
現実的な「WordPress on Azure App Service」 クイックスタート
Kazuyuki Miyake
 
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみたサーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
Itaru Kitagawa
 
本番運用で使うVisual Studio
本番運用で使うVisual Studio本番運用で使うVisual Studio
本番運用で使うVisual Studio
Kazuyuki Miyake
 
第一回REST勉強会_鈴木商店の開発環境
第一回REST勉強会_鈴木商店の開発環境第一回REST勉強会_鈴木商店の開発環境
第一回REST勉強会_鈴木商店の開発環境
tsuchimon
 
Azure Arcで「どこでも」Azureサービスを利用可能に!
Azure Arcで「どこでも」Azureサービスを利用可能に!Azure Arcで「どこでも」Azureサービスを利用可能に!
Azure Arcで「どこでも」Azureサービスを利用可能に!
Masahiko Ebisuda
 
Apiドキュメンテーションツールを使いこなす【api blueprint編】
Apiドキュメンテーションツールを使いこなす【api blueprint編】Apiドキュメンテーションツールを使いこなす【api blueprint編】
Apiドキュメンテーションツールを使いこなす【api blueprint編】
dcubeio
 
SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!
Kazumi IWANAGA
 
Idcfクラウドで始める構築自動化
Idcfクラウドで始める構築自動化Idcfクラウドで始める構築自動化
Idcfクラウドで始める構築自動化
智之 大野
 
コンテナで作る開発環境 (20161104 CodeIgniter Night)
コンテナで作る開発環境 (20161104 CodeIgniter Night)コンテナで作る開発環境 (20161104 CodeIgniter Night)
コンテナで作る開発環境 (20161104 CodeIgniter Night)
智之 大野
 

What's hot (19)

Getting started with Handoff
Getting started with HandoffGetting started with Handoff
Getting started with Handoff
 
Our Track to Modern Angular #2
Our Track to Modern Angular #2Our Track to Modern Angular #2
Our Track to Modern Angular #2
 
ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
ここにハマった!Dockerコンテナホスティング「Arukas」の裏側ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
 
2010年インストールマニアックス ~Javaアプリ編~
2010年インストールマニアックス ~Javaアプリ編~2010年インストールマニアックス ~Javaアプリ編~
2010年インストールマニアックス ~Javaアプリ編~
 
Riot.jsとフォームのデータバインディング
Riot.jsとフォームのデータバインディングRiot.jsとフォームのデータバインディング
Riot.jsとフォームのデータバインディング
 
Face APIで開発する時に使っている7つの道具
Face APIで開発する時に使っている7つの道具Face APIで開発する時に使っている7つの道具
Face APIで開発する時に使っている7つの道具
 
現場!実物!実践!マルチクラスタを運用するときの課題とコツ
現場!実物!実践!マルチクラスタを運用するときの課題とコツ現場!実物!実践!マルチクラスタを運用するときの課題とコツ
現場!実物!実践!マルチクラスタを運用するときの課題とコツ
 
Application Bootstrap
Application BootstrapApplication Bootstrap
Application Bootstrap
 
Wolcome to swift
Wolcome to swiftWolcome to swift
Wolcome to swift
 
スタートアップにjoinして1年間の変化を振り返る
スタートアップにjoinして1年間の変化を振り返るスタートアップにjoinして1年間の変化を振り返る
スタートアップにjoinして1年間の変化を振り返る
 
現実的な「WordPress on Azure App Service」 クイックスタート
現実的な「WordPress on Azure App Service」 クイックスタート現実的な「WordPress on Azure App Service」 クイックスタート
現実的な「WordPress on Azure App Service」 クイックスタート
 
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみたサーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
 
本番運用で使うVisual Studio
本番運用で使うVisual Studio本番運用で使うVisual Studio
本番運用で使うVisual Studio
 
第一回REST勉強会_鈴木商店の開発環境
第一回REST勉強会_鈴木商店の開発環境第一回REST勉強会_鈴木商店の開発環境
第一回REST勉強会_鈴木商店の開発環境
 
Azure Arcで「どこでも」Azureサービスを利用可能に!
Azure Arcで「どこでも」Azureサービスを利用可能に!Azure Arcで「どこでも」Azureサービスを利用可能に!
Azure Arcで「どこでも」Azureサービスを利用可能に!
 
Apiドキュメンテーションツールを使いこなす【api blueprint編】
Apiドキュメンテーションツールを使いこなす【api blueprint編】Apiドキュメンテーションツールを使いこなす【api blueprint編】
Apiドキュメンテーションツールを使いこなす【api blueprint編】
 
SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!
 
Idcfクラウドで始める構築自動化
Idcfクラウドで始める構築自動化Idcfクラウドで始める構築自動化
Idcfクラウドで始める構築自動化
 
コンテナで作る開発環境 (20161104 CodeIgniter Night)
コンテナで作る開発環境 (20161104 CodeIgniter Night)コンテナで作る開発環境 (20161104 CodeIgniter Night)
コンテナで作る開発環境 (20161104 CodeIgniter Night)
 

Similar to Smart fxでのsocketio活用事例

SL囲む会東京5 Nodejs×Silverlightではまったこと
SL囲む会東京5 Nodejs×SilverlightではまったことSL囲む会東京5 Nodejs×Silverlightではまったこと
SL囲む会東京5 Nodejs×Silverlightではまったこと
normalian
 
OpenStackで始めるクラウド環境構築入門 Havana&DevStack編
OpenStackで始めるクラウド環境構築入門 Havana&DevStack編OpenStackで始めるクラウド環境構築入門 Havana&DevStack編
OpenStackで始めるクラウド環境構築入門 Havana&DevStack編
VirtualTech Japan Inc.
 
HTML5のセキュリティ もうちょい詳しく- HTML5セキュリティその3 : JavaScript API
HTML5のセキュリティ もうちょい詳しく- HTML5セキュリティその3 : JavaScript APIHTML5のセキュリティ もうちょい詳しく- HTML5セキュリティその3 : JavaScript API
HTML5のセキュリティ もうちょい詳しく- HTML5セキュリティその3 : JavaScript APIYosuke HASEGAWA
 
IETF94 M2M Authentication関連報告
IETF94 M2M Authentication関連報告IETF94 M2M Authentication関連報告
IETF94 M2M Authentication関連報告
Masaru Kurahayashi
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 Java
Kazuhiro Hara
 
2011_9_9_AIR_LightningTalk
2011_9_9_AIR_LightningTalk2011_9_9_AIR_LightningTalk
2011_9_9_AIR_LightningTalk
Shozo Okada
 
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
Hirofumi Iwasaki
 
ガラケーで楽しむオレJSの勧め
ガラケーで楽しむオレJSの勧めガラケーで楽しむオレJSの勧め
ガラケーで楽しむオレJSの勧めHiroshi Tokumaru
 
Oracleがnode.jsをやり始めたというのだが!
Oracleがnode.jsをやり始めたというのだが!Oracleがnode.jsをやり始めたというのだが!
Oracleがnode.jsをやり始めたというのだが!
Hiroshi Hayakawa
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
Taisuke Oe
 
Play jjug2012spring
Play jjug2012springPlay jjug2012spring
Play jjug2012spring
Takafumi Ikeda
 
JJUG CCC.pptx
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptx
Kanta Sasaki
 
三協立山の仮想化基板の成長を支えるイーサネット・ファブリック
三協立山の仮想化基板の成長を支えるイーサネット・ファブリック三協立山の仮想化基板の成長を支えるイーサネット・ファブリック
三協立山の仮想化基板の成長を支えるイーサネット・ファブリック
Brocade
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
Tomohiro Kumagai
 
Windows Phone / iOS / Android アプリ同時開発のススメ
Windows Phone / iOS / Android アプリ同時開発のススメWindows Phone / iOS / Android アプリ同時開発のススメ
Windows Phone / iOS / Android アプリ同時開発のススメ
Yoshito Tabuchi
 
ZOZOTOWNで最大級のトラフィックを記録する福袋発売イベントで実施した負荷対策と、当日の監視体制について
ZOZOTOWNで最大級のトラフィックを記録する福袋発売イベントで実施した負荷対策と、当日の監視体制についてZOZOTOWNで最大級のトラフィックを記録する福袋発売イベントで実施した負荷対策と、当日の監視体制について
ZOZOTOWNで最大級のトラフィックを記録する福袋発売イベントで実施した負荷対策と、当日の監視体制について
Masaki Hirose
 
20230418_MJUG_vol1_kitazaki_v1.pdf
20230418_MJUG_vol1_kitazaki_v1.pdf20230418_MJUG_vol1_kitazaki_v1.pdf
20230418_MJUG_vol1_kitazaki_v1.pdf
Ayachika Kitazaki
 
Web socketドロンくん その後-
Web socketドロンくん その後-Web socketドロンくん その後-
Web socketドロンくん その後-
Yuuichi Akagawa
 
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
Satoshi Shimazaki
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
You&I
 

Similar to Smart fxでのsocketio活用事例 (20)

SL囲む会東京5 Nodejs×Silverlightではまったこと
SL囲む会東京5 Nodejs×SilverlightではまったことSL囲む会東京5 Nodejs×Silverlightではまったこと
SL囲む会東京5 Nodejs×Silverlightではまったこと
 
OpenStackで始めるクラウド環境構築入門 Havana&DevStack編
OpenStackで始めるクラウド環境構築入門 Havana&DevStack編OpenStackで始めるクラウド環境構築入門 Havana&DevStack編
OpenStackで始めるクラウド環境構築入門 Havana&DevStack編
 
HTML5のセキュリティ もうちょい詳しく- HTML5セキュリティその3 : JavaScript API
HTML5のセキュリティ もうちょい詳しく- HTML5セキュリティその3 : JavaScript APIHTML5のセキュリティ もうちょい詳しく- HTML5セキュリティその3 : JavaScript API
HTML5のセキュリティ もうちょい詳しく- HTML5セキュリティその3 : JavaScript API
 
IETF94 M2M Authentication関連報告
IETF94 M2M Authentication関連報告IETF94 M2M Authentication関連報告
IETF94 M2M Authentication関連報告
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 Java
 
2011_9_9_AIR_LightningTalk
2011_9_9_AIR_LightningTalk2011_9_9_AIR_LightningTalk
2011_9_9_AIR_LightningTalk
 
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
 
ガラケーで楽しむオレJSの勧め
ガラケーで楽しむオレJSの勧めガラケーで楽しむオレJSの勧め
ガラケーで楽しむオレJSの勧め
 
Oracleがnode.jsをやり始めたというのだが!
Oracleがnode.jsをやり始めたというのだが!Oracleがnode.jsをやり始めたというのだが!
Oracleがnode.jsをやり始めたというのだが!
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
 
Play jjug2012spring
Play jjug2012springPlay jjug2012spring
Play jjug2012spring
 
JJUG CCC.pptx
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptx
 
三協立山の仮想化基板の成長を支えるイーサネット・ファブリック
三協立山の仮想化基板の成長を支えるイーサネット・ファブリック三協立山の仮想化基板の成長を支えるイーサネット・ファブリック
三協立山の仮想化基板の成長を支えるイーサネット・ファブリック
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
 
Windows Phone / iOS / Android アプリ同時開発のススメ
Windows Phone / iOS / Android アプリ同時開発のススメWindows Phone / iOS / Android アプリ同時開発のススメ
Windows Phone / iOS / Android アプリ同時開発のススメ
 
ZOZOTOWNで最大級のトラフィックを記録する福袋発売イベントで実施した負荷対策と、当日の監視体制について
ZOZOTOWNで最大級のトラフィックを記録する福袋発売イベントで実施した負荷対策と、当日の監視体制についてZOZOTOWNで最大級のトラフィックを記録する福袋発売イベントで実施した負荷対策と、当日の監視体制について
ZOZOTOWNで最大級のトラフィックを記録する福袋発売イベントで実施した負荷対策と、当日の監視体制について
 
20230418_MJUG_vol1_kitazaki_v1.pdf
20230418_MJUG_vol1_kitazaki_v1.pdf20230418_MJUG_vol1_kitazaki_v1.pdf
20230418_MJUG_vol1_kitazaki_v1.pdf
 
Web socketドロンくん その後-
Web socketドロンくん その後-Web socketドロンくん その後-
Web socketドロンくん その後-
 
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 

Smart fxでのsocketio活用事例