2013-01-09 61 views
0

我寫了一個小型的Socket.IO服務器,它工作正常,我可以連接到它,我可以發送/接收消息,所以一切工作正常。您只需將代碼的相關部分這裏介紹:Redis - Pub/Sub Internals

var RedisStore = require('socket.io/lib/stores/redis'); 
const pub = redis.createClient('127.0.0.1', 6379); 
const sub = redis.createClient('127.0.0.1', 6379); 
const store = redis.createClient('127.0.0.1', 6379); 

io.configure(function() { 
    io.set('store', new RedisStore({ 
    redisPub : pub, 
    redisSub : sub, 
    redisClient : store 
    })); 
}); 

io.sockets.on('connection', function(socket) { 
socket.on('message', function(msg) { 
    pub.publish("lobby", msg); 
    }); 


    /* 
    * Subscribe to the lobby and receive messages. 
    */ 
    var sub = redis.createClient('127.0.0.1', 6379); 
    sub.subscribe("lobby"); 
    sub.on('message', function(channel, msg) { 
    socket.send(msg); 
    }); 
}); 

在這裏,我有興趣在某些客戶端訂閱到不同的房間的問題,這就是爲什麼我還使用裏面的子Redis的變量每個套接字連接:因爲每個客戶端可以訂閱不同的房間,並可以從那裏接收消息。我不完全確定上面的代碼是否正常,所以請讓我知道是否需要做其他任何事情,而不是在Socket.IO連接中定義子Redis連接:這也意味着爲每個連接生成一個新的Redis連接客戶端連接服務他的消息從被淹沒的房間?我想這是相當的開銷,所以我想盡可能地解決它?

謝謝

回答

0

雙方的Node.js和Redis的是在處理大量的連接(十萬是沒有問題的)非常好,所以你在做什麼是好的。如果您打算支持數千個連接,則需要考慮增加文件描述符限制。

+0

嗨,你能否確認以下是正確的:當每個客戶端連接時,它會產生它自己的連接到Redis服務器,所以有N + 3連接到Redis服務器,N是連接客戶端的數量,3是酒吧,分店,連鎖店,對吧?因此,所有客戶端都使用這3個連接(實際上只是酒吧連接)將消息發送到某些房間,而他們需要爲他們的傳入消息單獨連接:因爲他們各自訂閱了不同的房間。這可以進一步優化,每個房間只有1個連接,並且只向連接到它的客戶端發送消息 – eleanor

+0

,但那真的會優化那麼多。上述說明是否正確:我是否可以爲所有客戶端建立一個全局發佈連接,並且每個客戶端是否需要單獨的子連接?謝謝 – eleanor

+0

上面的代碼顯示每個連接都會得到自己的子連接,所以我認爲它應該是N * 2 + 3連接。正如你指出的那樣,你可以通過讓node.js訂閱所有內容並充當消息路由器(而不是通過dumber消息傳遞)來重複這一點。無論哪種方式應該工作得很好,redis是非常擅長處理大量的連接,所以如果你離開它,它會在實踐中罰款。關於哪個更好的決定歸結爲每個node.js節點有多少個連接。如果只有少數連接,那麼全局連接是有意義的 – hexist

相關問題