2015-09-23 31 views
11

Sto creando un'applicazione di chat che consente agli utenti di fare chat private e di gruppo. Pianificazione per l'uso seguenti tecnologie per questa applicazione: -Utilizzo di Redis come PubSub su Socket.io

NodeJs + Socket.io + Redis + CouchDB (alla storia messaggio negozio) + AngularJS

Per la mia ricerca iniziale utilizzando Redis come servizio PubSub è l'approccio migliore rispetto all'uso Socket.io come pub-sub. La ragione è se utenti diversi sono connessi a diverse istanze del server, quindi l'utilizzo di socket in questo scenario creerà problemi poiché il messaggio inviato dall'utente 1 non passerà all'utente 2 (utente 1 connesso al server 1 e utente 2 connessi al server 2).

Ma se usiamo Redis, allora per mia comprensione dobbiamo creare nuovi canali per abilitare chat private. E il loro è un limite ai 10k canali in Redis.

I miei dubbi sono

  1. Devo creare nuovo canale ogni volta per consentire chat privata tra due utenti?
  2. Se ho bisogno di creare canali separati, allora c'è davvero un limite di 10K canali?
  3. Ho bisogno di un esempio funzionante di utilizzo di Redis come pub/sub con socket.io per abilitare le chat private.

saluti, Vikram

risposta

14

Dopo aver letto di sotto articoli/post sul blog, utilizzando Redis per pub/sub sopra socket.io pub/sub aiuterà in termini di scalabilità e prestazioni migliori.

https://github.com/sayar/RedisMVA/blob/master/module6_redis_pubsub/README.md

https://github.com/rajaraodv/redispubsub

Inoltre sono in grado di creare un rapido POC in chat usando Redis privati. Ecco il codice: -

var app = require('http').createServer(handler); 
app.listen(8088); 
var io = require('socket.io').listen(app); 
var redis = require('redis'); 
var redis2 = require('socket.io-redis'); 
io.adapter(redis2({ host: 'localhost', port: 6379 })); 
var fs = require('fs'); 

function handler(req,res){ 
    fs.readFile(__dirname + '/index.html', function(err,data){ 
     if(err){ 
      res.writeHead(500); 
      return res.end('Error loading index.html'); 
     } 
     res.writeHead(200); 
     console.log("Listening on port 8088"); 
     res.end(data); 
    }); 
} 

var store = redis.createClient(); 
var pub = redis.createClient(); 
var sub = redis.createClient(); 
sub.on("message", function (channel, data) { 
     data = JSON.parse(data); 
     console.log("Inside Redis_Sub: data from channel " + channel + ": " + (data.sendType)); 
     if (parseInt("sendToSelf".localeCompare(data.sendType)) === 0) { 
      io.emit(data.method, data.data); 
     }else if (parseInt("sendToAllConnectedClients".localeCompare(data.sendType)) === 0) { 
      io.sockets.emit(data.method, data.data); 
     }else if (parseInt("sendToAllClientsInRoom".localeCompare(data.sendType)) === 0) { 
      io.sockets.in(channel).emit(data.method, data.data); 
     }  

    }); 

io.sockets.on('connection', function (socket) { 

    sub.on("subscribe", function(channel, count) { 
     console.log("Subscribed to " + channel + ". Now subscribed to " + count + " channel(s)."); 
    }); 

    socket.on("setUsername", function (data) { 
     console.log("Got 'setUsername' from client, " + JSON.stringify(data)); 
     var reply = JSON.stringify({ 
       method: 'message', 
       sendType: 'sendToSelf', 
       data: "You are now online" 
      });  
    }); 

    socket.on("createRoom", function (data) { 
     console.log("Got 'createRoom' from client , " + JSON.stringify(data)); 
     sub.subscribe(data.room); 
     socket.join(data.room);  

     var reply = JSON.stringify({ 
       method: 'message', 
       sendType: 'sendToSelf', 
       data: "Share this room name with others to Join:" + data.room 
      }); 
     pub.publish(data.room,reply); 


    }); 
    socket.on("joinRooom", function (data) { 
     console.log("Got 'joinRooom' from client , " + JSON.stringify(data)); 
     sub.subscribe(data.room); 
     socket.join(data.room);  

    }); 
    socket.on("sendMessage", function (data) { 
     console.log("Got 'sendMessage' from client , " + JSON.stringify(data)); 
     var reply = JSON.stringify({ 
       method: 'message', 
       sendType: 'sendToAllClientsInRoom', 
       data: data.user + ":" + data.msg 
      }); 
     pub.publish(data.room,reply); 

    }); 

    socket.on('disconnect', function() { 
     sub.quit(); 
     pub.publish("chatting","User is disconnected :" + socket.id); 
    }); 

    }); 

codice HTML

<html> 
<head> 
    <title>Socket and Redis in Node.js</title> 
    <script src="/socket.io/socket.io.js"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> 
</head> 
<body> 
<div id="username"> 
    <input type="text" name="usernameTxt" /> 
    <input type="button" name="setUsername" value="Set Username" /> 
</div> 
<div id="createroom" style="display:none;">> 
    <input type="text" name="roomNameTxt" /> 
    <input type="button" name="setRooomName" value="Set Room Name" /> 
    <input type="button" name="joinRooomName" value="Join" /> 
</div> 
<div id="sendChat" style="display:none;"> 
    <input type="text" name="chatTxt" /> 
    <input type="button" name="sendBtn" value="Send" /> 
</div> 
<br /> 
<div id="content"></div> 
<script>  
    $(document).ready(function() { 
     var username = "anonymous"; 
     var roomname = "anonymous"; 
     $('input[name=setUsername]').click(function(){ 
      if($('input[name=usernameTxt]').val() != ""){ 
       username = $('input[name=usernameTxt]').val(); 
       //var msg = {type:'setUsername',user:username}; 
       socket.emit('setUsername',{user:username}); 
      } 
      $('#username').slideUp("slow",function(){ 
       $('#createroom').slideDown("slow"); 
      }); 
     }); 
     $('input[name=setRooomName]').click(function(){ 
      if($('input[name=roomNameTxt]').val() != ""){ 
       roomname = $('input[name=roomNameTxt]').val(); 
       socket.emit('createRoom',{user:username,room:roomname}); 
      } 
      $('#createroom').slideUp("slow",function(){ 
       $('#sendChat').slideDown("slow"); 
      }); 
     }); 
     $('input[name=joinRooomName]').click(function(){ 
      if($('input[name=roomNameTxt]').val() != ""){ 
       roomname = $('input[name=roomNameTxt]').val(); 
       socket.emit('joinRooom',{room:roomname}); 
      } 
      $('#createroom').slideUp("slow",function(){ 
       $('#sendChat').slideDown("slow"); 
      }); 
     }); 

     var socket = new io.connect('http://localhost:8088'); 
     var content = $('#content'); 

     socket.on('connect', function() { 
      console.log("Connected"); 
     }); 

     socket.on('message', function(message){ 
      //alert('received msg=' + message); 
      content.append(message + '<br />'); 
     }) ; 

     socket.on('disconnect', function() { 
      console.log('disconnected'); 
      content.html("<b>Disconnected!</b>"); 
     }); 

     $("input[name=sendBtn]").click(function(){ 
      var msg = {user:username,room:roomname,msg:$("input[name=chatTxt]").val()} 
      socket.emit('sendMessage',msg); 
      $("input[name=chatTxt]").val(""); 
     }); 
    }); 
</script> 
</body> 
</html> 
+1

quello sub.on ("messaggio", la funzione (canale, dei dati) {sta facendo qui è che non c'è alcun bisogno di questo in questo codice –

+0

vedo che stai usando la stanza del socket.Può ridimensionare a più istanze? – Mubbashar

+0

Perché crei la variabile 'store'? La vedo in:' var store = redis.createClient(); ' – Stephane

3

Questo è tutto il codice di base Redis pub/sub.

var redis = require("redis"); 
 

 
var pub = redis.createClient(); 
 
var sub = redis.createClient(); 
 

 
sub.on("subscribe", function(channel, count) { 
 
    console.log("Subscribed to " + channel + ". Now subscribed to " + count + " channel(s)."); 
 
}); 
 

 
sub.on("message", function(channel, message) { 
 
    console.log("Message from channel " + channel + ": " + message); 
 
}); 
 

 
sub.subscribe("tungns"); 
 

 
setInterval(function() { 
 
    var no = Math.floor(Math.random() * 100); 
 
    pub.publish('tungns', 'Generated Chat random no ' + no); 
 
}, 5000);

1

Se avete bisogno di avere i piedi bagnati e creare una semplice applicazione di chat, quindi il seguente stack di sviluppo funziona molto bene insieme:

  • Express.js (Node. js)
  • Redis
  • Socket.IO

L'applicazione consiste in una chat room a cui gli utenti possono partecipare e avviare una conversazione. Socket.IO è responsabile dell'emissione di eventi quando il conteggio/i messaggi di chatter vengono aggiornati e questi vengono aggiornati nell'interfaccia utente utilizzando jQuery.

Per l'articolo completo e il codice sorgente, controllare il seguente link:. https://scalegrid.io/blog/using-redis-with-node-js-and-socket-io/

Problemi correlati