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

Pub/sub implementering i nodeJS

For objektpersistens tilføjede jeg Redissupport ved hjælp af node_redis. Derefter erstattede jeg client.send-løkken på rækken af ​​kanaler med Redis pub/subas, et lag af abstraktion. Men bemærkede, at jeg var nødt til at oprette en ny Redis-klient for hver bruger, der tegnede et abonnement. Og jeg havde stadig brug for at gemme socket.io-klientoplysninger for at sende beskeder til ved udgivelse. Hvor skalerbart er det? Er der andre (bedre) implementeringer eller yderligere optimeringer, jeg kunne lave? Hvad ville du gøre?

Ja, du skal oprette en ny redis-klient for hver io-anmodning. Den er tung og ikke skalerbar. Men at oprette en ny redis-klientforbindelse bruger ikke meget hukommelse. Så hvis dit systembrugerantal ikke er mere end 5000, så er det ok. For at skalere kan du tilføje en slave redis-server for at løse den tunge publicering og abonnere, og hvis du er bekymret for at skabe en masse forbindelser, kan du øge dit OS uLIMIT.

Du behøver ikke at gemme socket.io-klienten i den sendte besked. Når du har modtaget en abonnent kanalbesked igen. Det vil sende besked til en bestemt 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); > });

For at abonnere på flere kanaler. Jeg foreslår, at du på forhånd gemmer alle brugere med mere end én kanal (Du kan bruge lager Mongodb eller redis).

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

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


  1. Automatisk stigningssekvens i mongodb ved hjælp af java

  2. redis + gevent - Dårlig ydeevne - hvad gør jeg forkert?

  3. Apache Hadoop Architecture – HDFS, YARN &MapReduce

  4. Arbejder du med indlejrede objekter i Redis?