2016-04-12 13 views
0

私はかなりの時間のためにアプリケーションを構築してきましたが、スケーラビリティの点で問題に遭遇しています。私はNodeとHerokuのことを初めて知りました。私と一緒に抱きしめてください。Node、Express、Heroku、およびSocket.ioを使用してチャット「部屋」を作成する

私のノードサービスを稼動させるには、もともとthis tutorialに従ってください。本質的に、リアルタイムチャットサービスを作成します。しかし、今私の質問は、「部屋」を作ることになります。私は15以上のチャットを行っているかもしれませんが、同じclientSocketで同じ関数を呼び出すことはできません。フロントエンドでどのUIアップデートがどのクライアントに送られるかを判断する必要があります。今のところ、私は15人以上のクライアントがいろいろなチャットで対話しようとしていますが、一度に(たとえばメッセージが投稿されたときなど)全員に更新をプッシュしてから、どのルームID私は各デバイスにキャッシュしています。私にとってコンピューティングパワーのひどい浪費のようだ。

解決方法には、各クライアントの接続方法を変更する必要があると考えています(以下のコードスニペットです)。例えば、接続されたクライアントだけがそれらのアップデートを取得している場合など、ロケーションベースの「ルーム」を作成する方法はありますか?どのようにこの解決策を検討するか考えていますか?誰かがNode、Express、Heroku、Socket.ioなどについて私が理解していないことを説明しようとするなら、私に知らせてください。

socket.emit("room:general", json_object); 
    socket.on("room:general:newMessage", onYourDefinedEmiterListener); 
    .......... 
    .......... 
    //and so for each room 

私はチャット作ったことがない、

{ 
    user:your_username, 
    message:user_message 
    } 

io.on('connection', function(clientSocket) { 

     clientSocket.on('room:general', function(data) { 
      var user = data.user; 
      var message = data.message; 
      console.log('%s sent new message: %s',user,message); 

      io.emit('room:general:newMessage', data); 
     }); 
    //and so for each room 
    ......... 
    }); 

を、フロントエンドからあなたはJSONObjectを送信する必要があります。

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var pg = require('pg'); 

var userList = []; 
var typingUsers = {}; 
var ActiveQueue = []; 

app.get('/', function(req, res){ 
    res.send('<h1>Active RT Queue</h1>'); 
}); 


var conString = "postgres://url"; 
pg.defaults.ssl = true; 
var client = new pg.Client(conString); 
client.connect(function(err) { 
    if(err) { 
    return console.error('could not connect to postgres', err); 
    } 
}); 

http.listen(process.env.PORT || 5000, function(){ 
    console.log('Listening on *:5000'); 

}); 


io.on('connection', function(clientSocket){ 
    console.log('a user connected'); 

    clientSocket.on('disconnect', function(){ 
    console.log('user disconnected'); 

    var clientNickname; 
    for (var i=0; i<userList.length; i++) { 
     if (userList[i]["id"] == clientSocket.id) { 
     userList[i]["isConnected"] = false; 
     clientNickname = userList[i]["nickname"]; 
     break; 
     } 
    } 

    delete typingUsers[clientNickname]; 
    io.emit("userList", userList); 
    //io.emit("userExitUpdate", clientNickname); 
    //io.emit("userTypingUpdate", typingUsers); 
    }); 


    clientSocket.on("exitUser", function(clientNickname){ 
    for (var i=0; i<userList.length; i++) { 
     if (userList[i]["id"] == clientSocket.id) { 
     userList.splice(i, 1); 
     break; 
     } 
    } 
    io.emit("userExitUpdate", clientNickname); 
    }); 


    clientSocket.on("connectUser", function(clientNickname) { 
     var message = "User " + clientNickname + " was connected."; 
     console.log(message); 

     var userInfo = {}; 
     var foundUser = false; 
     for (var i=0; i<userList.length; i++) { 
     if (userList[i]["nickname"] == clientNickname) { 
      userList[i]["isConnected"] = true 
      userList[i]["id"] = clientSocket.id; 
      userInfo = userList[i]; 
      foundUser = true; 
      break; 
     } 
     } 

     if (!foundUser) { 
     userInfo["id"] = clientSocket.id; 
     userInfo["nickname"] = clientNickname; 
     userInfo["isConnected"] = true 
     userList.push(userInfo); 
     } 

     io.emit("userList", userList); 
     io.emit("userConnectUpdate", userInfo) 
    }); 

///functions pertaining to transfer of messages and updating the UI follow 
+0

[部屋と名前空間](http://socket.io/docs/rooms-and-namespaces/)は、あなたの探しているものと同じように聞こえます。 –

+0

@JoeClayありがとうございました。それぞれの部屋に異なる名前空間を作成するとしましょう。これらの異なる名前空間に準拠するように、すでに書いた関数を複製する必要がありますか?それとも、それぞれたくさんのトラフィックを処理できる部屋をたくさん作るのが理にかなっていますか?私は接続がどのように処理されているのか理解していないと思います – daulSwift

答えて

0

私はこのような何かをしようとするだろうアプリケーションは、それが助けて欲しい。

関連する問題