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連接客戶端連接服務他的消息從被淹沒的房間?我想這是相當的開銷,所以我想盡可能地解決它?
謝謝
嗨,你能否確認以下是正確的:當每個客戶端連接時,它會產生它自己的連接到Redis服務器,所以有N + 3連接到Redis服務器,N是連接客戶端的數量,3是酒吧,分店,連鎖店,對吧?因此,所有客戶端都使用這3個連接(實際上只是酒吧連接)將消息發送到某些房間,而他們需要爲他們的傳入消息單獨連接:因爲他們各自訂閱了不同的房間。這可以進一步優化,每個房間只有1個連接,並且只向連接到它的客戶端發送消息 – eleanor
,但那真的會優化那麼多。上述說明是否正確:我是否可以爲所有客戶端建立一個全局發佈連接,並且每個客戶端是否需要單獨的子連接?謝謝 – eleanor
上面的代碼顯示每個連接都會得到自己的子連接,所以我認爲它應該是N * 2 + 3連接。正如你指出的那樣,你可以通過讓node.js訂閱所有內容並充當消息路由器(而不是通過dumber消息傳遞)來重複這一點。無論哪種方式應該工作得很好,redis是非常擅長處理大量的連接,所以如果你離開它,它會在實踐中罰款。關於哪個更好的決定歸結爲每個node.js節點有多少個連接。如果只有少數連接,那麼全局連接是有意義的 – hexist