2015-09-23 10 views
11

私は、ユーザーがプライベートチャットやグループチャットを行うことを可能にするチャットアプリケーションを作成しています。計画は、このアプリのために、次のテクノロジを使用する: - PubSubのサービスとしてのRedisを使ってRedisをPubSub over Socket.ioとして使用する

(ストアのメッセージ履歴を)NodeJs + Socket.io + Redisの+のCouchDB + AngularJS

私の最初の研究パー

は使用してのよりよいアプローチですこれは、異なるユーザーが異なるサーバーインスタンスに接続されている場合、このシナリオでソケットを使用すると、ユーザー1が送信するメッセージがユーザー2に渡されないという問題が発生します(ユーザー1がサーバーに接続されています1とユーザ2がサーバ2に接続されている)。

私たちがRedisを使用している場合、私の理解によれば、プライベートチャットを可能にする新しいチャネルを作成する必要があります。そして、彼らはRedisの10kチャンネルに限度があります。

私の疑問は

  1. ある私は、新しいチャネルに2人のユーザ間のプライベートチャットを有効にするたびに作成する必要がありますか?
  2. 別々のチャネルを作成する必要がある場合、実際には10Kチャネルの制限がありますか?
  3. プライベートチャットを有効にするためにRedisをpub/subとsocket.ioで使用する実例が必要です。

よろしく、 ビクラム

答えて

14

記事/ブログの記事の下に読んだ後、socket.ioパブリッシュ/サブスクライブの上にパブリッシュ/サブスクライブのためのRedisを使用すると、スケーラビリティとパフォーマンスが向上するのに役立ちます。

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

https://github.com/rajaraodv/redispubsub

さらに私はRedisのを使用してプライベートチャットで迅速なPOCを作成することができています。すべてのコードの基本的なRedisのパブ/サブだ

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); 
    }); 

    }); 

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

何sub.onは、この任意の必要があるですこのコードで –

+0

あなたはsocketio roomを使っていますが、複数のインスタンスに拡大縮小しますか? – Mubbashar

+0

なぜ 'store'変数を作成するのですか?' var store = redis.createClient(); ' – Stephane

3

- :ここでは、コードです。

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

、あなたの足が濡れると簡単なチャットアプリケーションを作成する必要がある場合は、次の開発スタックは一緒に非常にうまく動作します:

  • Express.js(ノード。 js)
  • Redis
  • Socket.IO

アプリケーションは、ユーザーが参加して会話を開始できるチャットルームで構成されています。 Socket.IOは、チャタリング数/メッセージが更新されたときにイベントを発生させ、jQueryを使用してこれらのイベントをUIで更新します。記事全文およびソースコードについては

、次のリンクをチェックアウト:。(「メッセージ」、機能(チャネル、データ){ここでやっているhttps://scalegrid.io/blog/using-redis-with-node-js-and-socket-io/

関連する問題