Per la persistenza degli oggetti, ho aggiunto Redissupport usando node_redis. Quindi ho sostituito il ciclo client.send sull'array di canali con Redis pub/subas uno strato di astrazione. Ma ho notato che dovevo creare un nuovo client Redis per ogni utente che ha effettuato un abbonamento. E avevo ancora bisogno di memorizzare le informazioni sul client socket.io a cui inviare messaggi al momento della pubblicazione. Quanto è scalabile? Ci sono altre (migliori) implementazioni o ulteriori ottimizzazioni che potrei fare? Cosa faresti?
Sì, devi creare un nuovo client redis per ogni richiesta io. È pesante e non scalabile. Ma la creazione di una nuova connessione client Redis non consuma molta memoria. Quindi, se il numero di utenti del tuo sistema non è superiore a 5000, allora va bene. Per ridimensionare puoi aggiungere un server Redis slave per risolvere la pubblicazione e l'abbonamento pesanti e se sei preoccupato di creare molte connessioni, puoi aumentare il tuo sistema operativo uLIMIT.
Non è necessario memorizzare il client socket.io nel messaggio inviato. Una volta ricevuto il messaggio del canale sottoscritto. Invierà un messaggio a un particolare client io.
subscribe.on("message",function(channel,message) {
var msg = { message: [client.sessionId, message] };
buffer.push(msg);
if (buffer.length 15) buffer.shift();
client.send(msg); > });
Per iscriversi multicanale. Ti suggerisco di pre-memorizzare tutti gli utenti con più di un canale (puoi usare lo storage Mongodb o redis).
var store = redis.createClient();
var subscriber= redis.createClient()
store.hgetall(UID, function(e, obj){
subscriber.subscribe(obj.ChannelArray.toArray());
})