2014-09-13 148 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