Redis
 sql >> Database >  >> NoSQL >> Redis

Implementazione pub/sub in nodeJS

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());
 })