sql >> Database >  >> NoSQL >> Redis

Pub/sub-implementatie in nodeJS

Voor objectpersistentie heb ik Redissupport toegevoegd met node_redis. Daarna heb ik de client.send-lus op de reeks kanalen vervangen door Redis pub/sub als een abstractielaag. Maar ik merkte dat ik een nieuwe Redis-client moest maken voor elke gebruiker die een abonnement had afgesloten. En ik moest nog steeds socket.io-clientinformatie opslaan om berichten naar te verzenden bij publicatie. Hoe schaalbaar is dat? Zijn er andere (betere) implementaties of verdere optimalisaties die ik zou kunnen maken? Wat zou je doen?

Ja, je moet voor elk io-verzoek een nieuwe redis-client maken. Het is zwaar en niet schaalbaar. Maar het maken van een nieuwe redis-clientverbinding kost niet veel geheugen. Dus als het aantal gebruikers van uw systeem niet meer dan 5000 is, is het goed. Om te schalen kunt u een slave redis-server toevoegen om het zware publiceren en abonneren op te lossen en als u zich zorgen maakt over het maken van veel verbindingen, kunt u uw besturingssysteem uLIMIT vergroten.

U hoeft de socket.io-client niet op te slaan in het verzonden bericht. Eenmaal opnieuw ontvangen geabonneerd kanaalbericht. Het stuurt een bericht naar een bepaalde io-client.

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

Abonneren op meerdere kanalen. Ik raad u aan om alle gebruikers met meer dan één kanaal vooraf op te slaan (u kunt opslag Mongodb of redis gebruiken).

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

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


  1. Multi-Field Query's op Redis met Redis Spring

  2. MongooseError [MongooseServerSelectionError]:verbinding <monitor> naar 52.6.250.237:27017 gesloten

  3. MongoDB $push versus $addToSet:wat is het verschil?

  4. Importeer een CSV-bestand in MongoDB met mongoimport