socket.io-redis, socket.io-emitter, sticky-session の違いとは?

socket.io を使っていると以下が問題になることがある。
これらを解決するのが
socket.io-redis, socket.io-emitter, sticky-session
というわけ。


【問題1】
clusterで複数プロセスを起動していると複数プロセス間で通信ができなくなる。
ユーザー1が接続を開始するとclusterがプロセス1に接続するように割り振る。
次にユーザー2が接続を開始するとclusterはプロセス2に接続するように割り振る。
この場合、ユーザー1とユーザー2が同じルームに所属していても、
接続を割り振られたプロセスが違うので通信できなくなる。
つまり、ユーザー1がルームに送信したメッセージをユーザー2が受信できない。

【問題2】
socket.ioはクライアントがトリガーになってメッセージを送信するので、
サーバからPUSHするタイプの送信はできない。
iOS, AndroidアプリでいうPUSH通知のイメージ。

【問題3】
socket.io はwebsocketだけではなく、
ポーリングなど複数の方法でリアルタイム通信を実現するモジュールだが、
clusterで複数プロセスを起動するとポーリングを利用した場合、
ユーザーのセッションを管理できなくなる。
これは1番で説明した問題のポーリング版だと思ってもらえればいい。
仮にwebsocketしか利用しないのであれば、この問題は発生しない。

これらの問題を解決するモジュールが
socket.io-redis, socket.io-emitter, sticky-session になる。

1番の問題は socket.io-redis で解決できる。
redisの pub/sub を利用することでプロセス間通信が可能。
https://github.com/automattic/socket.io-redis

2番の問題は socket.io-emitter で解決できる。
これもredisのpub/subを利用している。
http://d.hatena.ne.jp/pospome/20150322/1427040357
ちなみに、PHPからもPUSHできるっぽい。
https://github.com/rase-/socket.io-php-emitter

3番の問題は sticky-session で解決できる。
これは試していないから分からない・・・・。