Posted at

Socket.IOを活用したリアルタイムWebサイト構築事例

More than 5 years have passed since last update.


Socket.IO Meetupで発表した資料

SmartFXでのSocket.IO活用事例という題でLTを行ってきました。

英語版

日本語版

Socket.IOの作者がいらしているということもあって、英語のパワポで挑戦したものの、初めてのLTということもあり、自分でも何をいっているかわからなかったため、記事で補足します。


Socket.IO-reqevについて

socket.io-reqevは、EventEmitterを活用することで、モジュール同士の結合をなくすというJavaScriptでよく使われる戦略を使っています。

イベントを送りたいモジュールは、socket.ioにまったく依存することなく、イベントをただemitするだけで、その内容がクライアントに届くようになります。

そのため、Socket.IO-ReqEv使いたくなくなった場合の対応も容易ですし、Socket.IO-ReqEv以外にもログのようなモジュールを簡単にはさめます。

また、NameSpaceに対してどのモジュールが結びついているのか、モジュールが何のイベントを送信しているのかがすぐ把握でき、保守もすごく楽です。

さらにイベントだけでなく、単にその時点の情報を取得したいという場合にrequestという仕組みがあるため、Push通信のために使うというのではなく、APIサーバとして使うことが可能です。

SmartFXでは、ユーザ情報などSNS的要素はWebサーバ、為替レートなどのマーケット情報は、Socket.IOサーバというように、扱うサーバによって扱う情報をまったく分けることで、DBの構造の変更が別のサーバに影響を与えないようになっています。

内部的に指定されたNameSpaceのroomしか管理していないので、直接Socket.IOオブジェクトのオプションをいじったり、違うNameSpaceをつかって、Socket.io-reqevを使わずに処理を行うことも可能です。


Socket.IOサーバの運用について

やってることはドロくさいのですが、まあ、実運用ってそんなものでしょう?

リバースプロキシとかでやるとかっこいいとは思いますが、そのリバースプロキシ自体の冗長化を考える必要がでてきたり、コネクションはったままのSocket.IOに対してどうdeployをするかといったことを考えると、なんだかんだで今回のやりかたが今のところベターなのではと感じています。


その他

英語化は会社の同僚の方がほとんど手直ししてくれたのにうまく発表できなくて、正直すまんかった。