2014-09-13 141 views
0

所以我创建了一个使用socket.io,redis和node.js的实时应用程序。错误:Redis连接到127.0.0.1:6379失败 - 连接EMFILE

的问题是,有30个用户,我已经到达(服务器的连接数,我运行Ubuntu 14.04。

我认为这事做对我连接方式Redis的。

所以在一个页面上,我有最多12个频道订阅。两架socket.io连接,一个有6个通道和其他具有其他6个通道。

显示我的节点之前的js代码,我所做的是针对每个渠道,我创建了一个新的redis客户端,因此假设我有一个插入更新通道,对Node.js的代码,所以我的代码wiil是:

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.

那么如何优化代码,减少每个客户端的连接数到一个或两个最大值?

是否有帮助,有var insert = redis.createClient();以外的data.on('连接') ??

回答

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 subcribers只能订购 - 您需要第二个客户端发布或执行其他任何redis操作。

+0

对不起,实际上我试图做单独的事情,这是一个错误,你能给我一个代码示例,因为每次我尝试使用相同的Redis客户端时,我只得到第一个订阅,而不是第二个订阅.. – Tio 2014-09-14 14:11:18

+0

@Tio编辑。这有帮助吗? – 2014-09-15 02:11:51

+0

是的,我真的设法解决它昨天,做这样的事情,对我来说,唯一的变化是,我需要在data.on('连接')内的订阅,由于变量被传递,该选择的正确频道,谢谢.. – Tio 2014-09-15 09:42:54

-1

使用socket.io的namespace。在每个名称空间内,您还可以定义房间,但命名空间应该足以满足您的需求。

+0

实际上,我已经在使用socket.io的命名空间,正如你在我发布的例子中看到的那样。 – Tio 2014-09-15 09:43:51

相关问题