将 redis 用于 pub-sub 时不需要的多条消息

Posted

技术标签:

【中文标题】将 redis 用于 pub-sub 时不需要的多条消息【英文标题】:Unwanted multiple messages when using redis for 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 感到困惑。请帮忙。

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

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

【讨论】:

以上是关于将 redis 用于 pub-sub 时不需要的多条消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥mysql在持久化上比redis用的多

使用 request-reply 和 pub-sub 进行微服务通信

将带有 JMS (ActiveMQ) 的 Spring Boot 应用程序迁移到 GCP 的 pub-sub

Apache Kafka工作流程| Kafka Pub-Sub Messaging

将 falcor 用于具有瞬态数据的多参数请求

一个 VPC 终端节点用于 AWS 中的多项服务