För objektbeständighet lade jag till Redissupport med node_redis. Sedan ersatte jag client.send-loopen på arrayen av kanaler med Redis pub/subas, ett lager av abstraktion. Men insåg att jag behövde skapa en ny Redis-klient för varje användare som gjorde prenumeration. Och jag behövde fortfarande lagra socket.io-klientinformation för att skicka meddelanden till vid publicering. Hur skalbart är det? Finns det andra (bättre) implementeringar eller ytterligare optimeringar jag kan göra? Vad skulle du göra?
Ja, du måste skapa en ny redis-klient för varje io-förfrågan. Den är tung och inte skalbar. Men att skapa en ny redis-klientuppkoppling kräver inte mycket minne. Så om ditt systemanvändarantal inte är mer än 5000 så är det ok. För att skala kan du lägga till en slavredis-server för att lösa den tunga publiceringen och prenumerera och om du är orolig för att skapa många anslutningar kan du öka ditt OS uLIMIT.
Du behöver inte lagra socket.io-klienten i skickat meddelande. När du har fått ett prenumererat kanalmeddelande på nytt. Det kommer att skicka meddelande till en viss io-klient.
subscribe.on("message",function(channel,message) {
var msg = { message: [client.sessionId, message] };
buffer.push(msg);
if (buffer.length 15) buffer.shift();
client.send(msg); > });
För att prenumerera på flera kanaler. Jag föreslår att du förlagrar alla användare med mer än en kanal (du kan använda lagring Mongodb eller redis).
var store = redis.createClient();
var subscriber= redis.createClient()
store.hgetall(UID, function(e, obj){
subscriber.subscribe(obj.ChannelArray.toArray());
})