首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为即时通信系统设计redis pub/sub?

如何为即时通信系统设计redis pub/sub?
EN

Stack Overflow用户
提问于 2012-04-13 21:59:35
回答 1查看 10.7K关注 0票数 14

我是redis pub/sub的新手。我在系统中有一个聊天工具,就像IM一样。所以我想使用redis pub/sub。由于我已经检查了样本,它们中的大多数都是基于聊天室设计的。在我的系统中,我会在用户之间建立多个聊天室,比如;

代码语言:javascript
复制
A:B
A:C
D:C
E:F

所以,上面的线是房间。我用node.js实现了服务器,如下所示;

代码语言:javascript
复制
var store = redis.createClient();
var pub = redis.createClient();
io.sockets.on('connection', function (socket) {
    var sub = redis.createClient();

    sub.on("message", function(pattern, data){
            data = JSON.parse(data);
        socket.send(JSON.stringify({ type: "chat", key: pattern, nick: data.nickname, message: data.text }))
        }
    });

    socket.on('message', function (messageData) {
        store.incr("messageNextId", function(e, messageId) {
        var room = ""
        var from = messageData.clientId > socket.nickname ? socket.nickname : messageData.clientId;
        var to = messageData.clientId < socket.nickname ? socket.nickname : messageData.clientId;   
            room = from + ":" + to;

        var message = { id: messageId, nickname: socket.nickname, text: messageData.text };
        store.rpush("rooms:" + room, JSON.stringify(message), function(e, r) {  
             pub.publish(room, JSON.stringify(message))
        });
    });
});

正如您所看到的,我正在为每个连接创建一个新的redis订阅者。在其他聊天室示例中,redis订阅者客户端是全局创建的。而且始终只有三个连接,这解决了它们的问题,因为当发布者发布消息时,所有连接的客户端都应该获得它。但我在这里有一个限制。我想在两个用户之间打开一个聊天会话,只有这些用户应该是订阅者。上面的代码按照我希望的那样工作,但我不知道redis是否可以为每个连接创建一个新的订阅者客户端。

如果能听到你的建议,那就太好了。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-13 22:51:32

像往常一样,您需要根据自己的用例对这样的事情进行基准测试--不可能给出一般的建议。您可能需要增加系统上打开的文件的最大数量,无论是在系统范围内还是为redis用户。当然,这也适用于运行您的web服务器的用户。

也就是说,您应该确保在用户离开时侦听socket.on('disconnect')quit()。你可能还想知道socket.io有一个redis后端,它利用了redis pub/sub,它也有房间的概念,所以你可以省去一些麻烦,因为你已经依赖于socket.io了。

Redis编辑:在快速检查后,我在991订阅者之后收到来自的错误消息:

代码语言:javascript
复制
Ready check failed: Error: Error: ERR max number of clients reached

下面是来自默认redis.conf的代码

代码语言:javascript
复制
# Set the max number of connected clients at the same time. By default
# this limit is set to 10000 clients, however if the Redis server is not
# able ot configure the process file limit to allow for the specified limit
# the max number of allowed clients is set to the current file limit
# minus 32 (as Redis reserves a few file descriptors for internal uses).
#
# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
#
# maxclients 10000

我的系统(Ubuntu11.11)默认的nofile限制是1024,所以我的快速测试应该会在992个连接的客户端之后失败,这看起来是正确的(我也有一个发布者的客户端)。我给你的建议是检查你的nofile限制(在我的系统上,它在/etc/security/limits.{conf,d/*}和你的redis maxclients设置中,然后是基准,基准,基准!

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10142246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档