我是Redis pub / sub的新手。我在系统中有一个聊天功能,就像IM。所以我想使用redis pub / sub。在我检查了样本之后,大多数样本都是基于聊天室设计的。在我的系统中,我将在多个用户之间建立多个聊天室,例如:
A:B A:C D:C E:F
所以,上面的几行是房间。我已经用如下的node.js实现了服务器;
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是否可以为每个连接创建一个新的订户客户端。
很高兴听到您的建议。提前致谢。
与往常一样,您需要针对自己的用例对此类事情进行基准测试- 无法提供一般性建议。您可能需要增加系统范围内或redis用户的最大打开文件数。当然,这也适用于运行Web服务器的用户。
也就是说,您应该确保在用户离开时收听socket.on('disconnect')和quit()Redis订阅者。您可能还想知道socket.io具有一个redis后端,该后端利用了redis pub / sub,还具有room的概念,因此您可以通过使用它来节省一些麻烦,因为您已经依赖于socket .io。
socket.on('disconnect')
quit()
编辑: 快速检查后,我从991个订户后从Redis收到此错误消息:
Ready check failed: Error: Error: ERR max number of clients reached
这是默认值redis.conf:
redis.conf
# 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
我的系统(Ubuntu 11.11)的默认nofile限制为1024,因此我的快速测试应该在连接了992个客户端之后失败,这在测试中似乎是正确的(我也有一个发布者客户端)。我的建议是检查您的nofile限制(在我的系统上,/etc/security/limits.{conf,d/*}以及您的redis maxclients设置,然后是基准,基准,基准!
nofile
/etc/security/limits.{conf,d/*}
maxclients