Redis在使用节点群集Socket.io时多次订阅
我正在使用socket.io实时发帖,
stream正在更新实时,但问题是多次redis订阅发生,并在post中出现多次。
我正在使用node.js cluster module
来创build多个节点集群。 这里是代码,
worker.js
var cluster = require('cluster'); var server = new Hapi.Server(config.port,view_options); var socketIO = require('socket.io'); var redis = require("socket.io/node_modules/redis"); var RedisStore = require('socket.io/lib/stores/redis'); var io = socketIO.listen(server.listener); var sub = redis.createClient(); sub.setMaxListeners(0); io.configure(function() { io.set('store', new RedisStore({ redisSub : sub })); io.set('transports', ['xhr-polling']); io.set('polling duration', '10'); }); if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork(); } } else { sub.subscribe("userstreams"); io.sockets.on('connection', function(socket) { // Realtime streams : subscribe to redis channel userstreams sub.on("message", function(channel, member_postid) { console.info("-----------realtime post receieved --------",member_postid); }); }); }
publisher.js
// head var redis = require("socket.io/node_modules/redis"); var pub = redis.createClient(); // inside a function pst = member + "::" + data.pid pub.publish("userstreams", pst);
客户端只发布一次postID,但是我在服务器的userstreams通道中获得了多个订阅。
我希望我的服务器只获得一次redis订阅,这样我就可以只将它们发送到一个用户的数据stream一次。
你需要为socket.ioconfigurationpub,sub和client:
var pub = redis.createClient(); var sub = redis.createClient(); var client = redis.createClient();
并将它们传递给socket.io
io.set('store', new io.RedisStore({ redisSub : sub, redisPub: pub, redisClient: client }));