使用redis for pub-sub时不需要的多条消息

时间:2014-08-02 12:28:32

标签: node.js redis socket.io publish-subscribe node-redis

当我使用socket.io执行pub / sub时,以下代码工作得很好。

基本上,我从浏览器发送聊天消息。在服务器上,我收听此消息并将其发回给所有来自服务器的相同消息。因此,我希望每发送一条消息都会返回/打印1条消息。

通过以下内容,我可以从多个浏览器登录,当我发送聊天消息时,它会按预期返回/打印为单个聊天消息。

io.use(socketHandshake({store: sessionStore, key:'jsessionid', secret:'secret', parser:cookieParser()}));
io.on('connection', function (socket) {
    socket.on('chat', function (message) {
        io.emit('chat', "hello world");
    });
});

然而,当我尝试使用redis做pub / sub时,会出现问题。

从第一个浏览器:1个聊天消息导致打印出1个聊天消息

从第二个浏览器:1个聊天消息导致打印出2个聊天消息

从第三个浏览器:1个聊天消息导致打印出3个聊天消息

var sub = redis.createClient();
var pub = redis.createClient();
sub.subscribe('chat');
io.use(socketHandshake({store: sessionStore, key:'jsessionid', secret:'secret', parser:cookieParser()}));
io.on('connection', function (socket) {
    socket.on('chat', function (message) {
        // io.emit('chat', "hello world");
        pub.publish('chat', "hello world");
    });
    sub.on('message', function (channel, message) {
        io.emit(channel, message);
    });
});

我错过了什么?我是初学者,我正在使用最新版本的express,socket.io,socket.io-handshake和redis来尝试这个示例http://blog.cloudfoundry.org/2013/01/24/scaling-real-time-apps-on-cloud-foundry-using-node-js-and-redis/

我对这个redis pub / sub感到难过。请帮忙。

2 个答案:

答案 0 :(得分:8)

您为每个连接添加了一个新的“消息”处理程序。这就是为什么你开始看到越来越多的连接越来越多的重复。尝试将sub.on('message', ...);移到socket.io连接处理程序之外。

答案 1 :(得分:0)

我知道这是一个老问题,但也许这可以帮助为那里的人提供另一种解决方案,我昨天发现这个错误后发现自己是一个解决方案。 尝试改变io.emit(频道,消息); into socket.emit(channel,message);