LoginSignup
7
8

More than 5 years have passed since last update.

Socket.IO を PM2 でロードバランシングしたい

Last updated at Posted at 2015-05-18

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系の書き方

app.js
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のロードバランシングに成功している人はバージョンを明記の上、記事を投稿して欲しい!



  1. ブログやQiitaにアップされている記事のほぼ全てで、どのバージョンを使った記事なのか明記されていなかった。Nodo.js界隈はバージョンアップが激しく、バージョンが変わると動かないことが多いので、バージョンを明記して欲しい。 

  2. https://github.com/Automattic/socket.io-redis/blob/master/README.md 

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8