私はNode.js、Socket.ioとRedisstore、ClusterとSocket.ioのユーザー、Redisを使用しています。クラスタ化されたnode.js/socket.io/redis pub/subアプリケーションに重複したメッセージが届いています
1つのNode.jsノードでうまく動作するpub/subアプリケーションがあります。しかし、Node.jsはマルチコアマシン用に書かれていないので、重い負荷がかかると、サーバのコアが1つだけになります。
私は現在、Socket.ioを作ったのと同じ人であるLearnboostのClusterモジュールを使用しています。
しかし、私は4つのワーカープロセスを起動すると、来て、購読する各ブラウザクライアントは、Redisで公開されている各メッセージの4つのコピーを取得します。 3つのワーカープロセスがある場合は、3つのコピーがあります。
私はredis pub/sub機能を何とかcluster.jsファイルに移動する必要があると思います。
Cluster.js
var cluster = require('./node_modules/cluster');
cluster('./app')
.set('workers', 4)
.use(cluster.logger('logs'))
.use(cluster.stats())
.use(cluster.pidfiles('pids'))
.use(cluster.cli())
.use(cluster.repl(8888))
.listen(8000);
App.js
redis = require('redis'),
sys = require('sys');
var rc = redis.createClient();
var path = require('path')
, connect = require('connect')
, app = connect.createServer(connect.static(path.join(__dirname, '../')));
// require the new redis store
var sio = require('socket.io')
, RedisStore = sio.RedisStore
, io = sio.listen(app);
io.set('store', new RedisStore);io.sockets.on('connection', function(socket) {
sys.log('ShowControl -- Socket connected: ' + socket.id);
socket.on('channel', function(ch) {
socket.join(ch)
sys.log('ShowControl -- ' + socket.id + ' joined channel: ' + ch);
});
socket.on('disconnect', function() {
console.log('ShowControll -- Socket disconnected: ' + socket.id);
});
});
rc.psubscribe('showcontrol_*');
rc.on('pmessage', function(pat, ch, msg) {
io.sockets.in(ch).emit('show_event', msg);
sys.log('ShowControl -- Publish sent to channel: ' + ch);
});
// cluster compatiblity
if (!module.parent) {
app.listen(process.argv[2] || 8081);
console.log('Listening on ', app.address());
} else {
module.exports = app;
}
client.html
<script src="http://localhost:8000/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<script>
var socket = io.connect('localhost:8000');
socket.emit('channel', 'showcontrol_106');
socket.on('show_event', function (msg) {
console.log(msg);
$("body").append('<br/>' + msg);
});
</script>
これを解決するためにあなたが投稿したことができますか? –
私たちがここで行ったことを見ることができます:https://github.com/StageIt/redis しかし、socket.ioの不具合のために1つのノードにロールバックしました。そのバグの議論がありますが、今修正されているかもしれません:https://github.com/LearnBoost/socket.io/issues/438#issuecomment-3371390 – messick