sql >> Databáze >  >> NoSQL >> Redis

Implementace pub/sub v nodeJS

Pro persistenci objektů jsem přidal Redissupport pomocí node_redis. Poté byla smyčka client.send na poli kanálů nahrazena Redis pub/sub jako vrstvou abstrakce. Ale všiml jsem si, že jsem potřeboval vytvořit nového klienta Redis pro každého uživatele, který provedl předplatné. A stále jsem potřeboval uložit informace o klientovi socket.io, abych mohl odesílat zprávy při publikování. Jak škálovatelné je to? Existují jiné (lepší) implementace nebo další optimalizace, které bych mohl provést? Co byste udělali?

Ano, pro každý požadavek io musíte vytvořit nového klienta redis. Je těžký a není škálovatelný. Vytvoření nového připojení klienta redis však nespotřebovává mnoho paměti. Takže pokud váš systémový počet uživatelů není větší než 5000, je to v pořádku. Chcete-li škálovat, můžete přidat slave redis server, abyste vyřešili náročné publikování a přihlášení k odběru, a pokud se obáváte vytváření velkého množství připojení, můžete zvýšit svůj OS uLIMIT.

Klienta socket.io nemusíte ukládat do odeslané zprávy. Jakmile znovu obdržíte zprávu odebíraného kanálu. Odešle zprávu konkrétnímu klientovi 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); > });

Chcete-li se přihlásit k odběru více kanálů. Doporučuji předem uložit všem uživatelům více než jeden kanál (můžete použít úložiště Mongodb nebo redis).

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

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


  1. Jak vytvořit index se specifickým názvem v MongoDB

  2. Mongoose řetězec na ObjectID

  3. Hromadné vkládání Redis

  4. mongodb.conf bind_ip =127.0.0.1 nefunguje, ale 0.0.0.0 funguje