Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Pub/Sub-Implementierung in nodeJS

Für die Objektpersistenz habe ich Redissupport mit node_redis hinzugefügt. Dann ersetzte ich die client.send-Schleife auf dem Array von Kanälen durch Redis pub/subas als Abstraktionsebene. Aber mir ist aufgefallen, dass ich für jeden Benutzer, der ein Abonnement abgeschlossen hat, einen neuen Redis-Client erstellen musste. Und ich musste immer noch Socket.io-Client-Informationen speichern, um Nachrichten bei der Veröffentlichung zu senden. Wie skalierbar ist das? Gibt es andere (bessere) Implementierungen oder weitere Optimierungen, die ich vornehmen könnte? Was würden Sie tun?

Ja, Sie müssen für jede io-Anfrage einen neuen Redis-Client erstellen. Es ist schwer und nicht skalierbar. Das Erstellen einer neuen Redis-Client-Verbindung verbraucht jedoch nicht viel Speicher. Wenn die Anzahl Ihrer Systembenutzer also nicht mehr als 5000 beträgt, ist dies in Ordnung. Um zu skalieren, können Sie einen Slave-Redis-Server hinzufügen, um das schwere Publizieren und Abonnieren zu lösen, und wenn Sie Bedenken haben, viele Verbindungen herzustellen, können Sie Ihr OS uLIMIT erhöhen.

Sie müssen den socket.io-Client nicht in der gesendeten Nachricht speichern. Sobald redis die Nachricht des abonnierten Kanals erhalten hat. Es wird eine Nachricht an einen bestimmten io-Client gesendet.

subscribe.on("message",function(channel,message) { 
 var msg = { message: [client.sessionId, message] }; 
 buffer.push(msg);
 if (buffer.length 15) buffer.shift(); 
 client.send(msg); > });

Um mehrere Kanäle zu abonnieren. Ich empfehle Ihnen, alle Benutzer mit mehr als einem Kanal vorab zu speichern (Sie können Speicher Mongodb oder Redis verwenden).

var store = redis.createClient();
var subscriber= redis.createClient()

store.hgetall(UID, function(e, obj){
     subscriber.subscribe(obj.ChannelArray.toArray());
 })