想象一下有一个Node.js聊天应用程序。 它将在AWS上托管,可跨多个实例进行扩展。 聊天服务器应用程序具有这段代码,使用名为"套接字"的变量来跟踪谁在线或离线。 此代码适用于单个实例。但是,当服务器跨多个实例进行扩展时,此代码是否会失败?
var sockets = {};
io.configure(function () {
...
});
io.sockets.on('connection', function(socket) {
socket.on('online', function(data){
if(data.userId){
sockets[userId] = socket;
console.log("user " + userId + " connected.");
}
});
socket.on('disconnect', function () {
for(var key in sockets){
if(sockets[key] == socket)
{
delete sockets[key];
console.log("user " + key + " disconnected.");
break;
}
}
});
});
// check if a userId is connected
// will this still work when multiple server instances
function isUserIdOnline(userId)
{
return (sockets[userId] != null);
}
答案 0 :(得分:0)
不,它不适用于多个实例。 sockets
仅代表连接到此特定服务器的用户,而不代表所有其他服务器。
这个问题的可能答案涉及在中央数据库服务器中存储已连接的人员以及他们连接的服务器,以便任何套接字服务器都可以通过联系中央数据库来查明是否有人连接了他们连接的服务器。由于数据是暂时的,因此可以使用像redis这样的内存数据库。
在解决“谁是在线问题以及如何与他们联系”时,使用多个服务器处理连接的各种架构选项的相关讨论是in this answer。