【问题标题】:Unwanted multiple messages when using redis for pub-sub将 redis 用于 pub-sub 时不需要的多条消息
【发布时间】:2014-09-25 12:45:37
【问题描述】:

当我使用 socket.io 进行发布/订阅时,以下代码可以正常工作。

基本上,我从浏览器发送聊天消息。在服务器上,我收听此消息并将其发回给所有人,来自服务器的相同消息。因此,我希望我发送的每条消息都会返回/打印 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 感到困惑。请帮忙。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 完美。非常感谢! ...我的意思是,在尝试解决这个问题时,我什至(第一次)探索了如何在节点中调试/添加断点...并且在那些 F8 F8 F8 ... :-)
    【解决方案2】:

    我知道这是一个老问题,但也许这可以帮助为那里的人们提供另一种解决方案,我在昨天遇到此错误后找到了自己的解决方案。 尝试改变 io.emit(channel, message);进入 socket.emit(channel, message);

    【讨论】:

      最近更新 更多