Socket.IO を PM2 でロードバランシングしたい
目的
PM2を使って、Socket.IOのプロセスを多重化してロードバランシングする。
問題点
Socket.IOは接続情報をオンメモリに保存しているので、プロセスを多重化してロードバランシングを行うと、接続情報の無いプロセスに接続した場合には新規connectとなる。
解決策
Socket.IOの接続情報をredisに保存することにより、プロセス間はredis経由で接続情報を共有する。
ただし!
Socket.IO 0.9系の接続しか成功しない。1
Socket.IO 1.2系, 1.3系ではadapterを使うらしいが、公式2のとおりに書いても動かない。
Node.jsのバージョンが0.12以上でなければならないという記載を見かけたが、0.12を使っても動かない。
提案
単一のポートでプロセスの多重化を行うことにこだわないのであれば、プロセス毎にポートを分けて、プロセス間で接続情報を共有する方法が確実である。
http://qiita.com/n0bisuke/items/c248af316ca3f27daf92
Socket.IO 0.9系の書き方
var server = app.listen(3000, function() {
});
// 0.9系のsocket.io
var io = require('socket.io').listen(server);
// 0.9系のredis
var redis = require('socket.io/lib/stores/redis');
var redisConf = { host: '127.0.0.1', port: 6379 };
// storeタイプをredisに変更
io.set('store', new redis({
redisPub: redisConf,
redisSub: redisConf,
redisClient: redisConf
}));
情報を求む!
Socket.IO 1.2, 1.3系でPM2を使ったSocket.IOのロードバランシングに成功している人はバージョンを明記の上、記事を投稿して欲しい!
-
ブログやQiitaにアップされている記事のほぼ全てで、どのバージョンを使った記事なのか明記されていなかった。Nodo.js界隈はバージョンアップが激しく、バージョンが変わると動かないことが多いので、バージョンを明記して欲しい。 ↩
-
https://github.com/Automattic/socket.io-redis/blob/master/README.md ↩