所以我使用socket.io,redis和node.js创建了一个实时应用程序。
问题是有30个用户,我已经达到了服务器的连接数(我正在运行Ubuntu 14.04。
我认为它与我连接redis的方式有关。
所以在一个页面上,我最多有12个频道可以订阅。在两个socket.io连接上,一个有6个通道,另一个有另外6个通道。
在显示我的节点js代码之前,我做的是每个频道,我创建了一个新的redis客户端,所以假设我有一个插入和更新通道,在node.js代码上,所以我的代码将是:
var data = io.of('/data');
data.on('connection', function(client) {
var insert = redis.createClient();
var update = redis.createClient();
insert.subscribe('insert');
insert.on("message", function(channel, message) {
client.emit('data_insert', message);
});
update.subscribe('update');
update.on("message", function(channel, message) {
client.emit('data_update', message);
});
});
我认为这就是问题所在,这就是为什么30个用户我超过了服务器连接的限制,因为30 * 12 + 2 * 30 = 420,还有其他几个用户,以及它很容易达到1024。
那么如何优化代码,将每个客户端的连接数减少到最多一个或两个?
在 data.on('connection')之外 var insert = redis.createClient(); 是否有帮助?
答案 0 :(得分:1)
您不应该为每个客户端创建一个(或多个)redis连接 - 只需继续使用相同的全局连接。此外,没有理由为您要订阅的每个频道创建一个客户端。只需使用channel
参数来确定哪些事情与数据有关(在这种情况下,你在每个频道上做同样的事情,所以更不用说分开它们了。)
var data = io.of('/data');
var redis = redis.createClient();
redis.subscribe('insert');
redis.subscribe('update');
data.on('connection', function(client) {
redis.on("message", function(channel, message) {
if(channel == 'insert')
client.emit('data_insert', message);
else if(channel == 'update')
client.emit('data_update', message);
});
});
可能有更好的方法可以做到这一点,但这是一个相当直接的代码转换为只使用一个redis连接的东西。
请注意,redis订阅者只能 订阅 - 您需要第二个客户端才能发布或执行任何其他redis操作。
答案 1 :(得分:-1)
使用socket.io的namespace。在每个命名空间中,您还可以定义房间,但命名空间应该足以满足您的需求。