我的NodeJS / SocketIO开发遇到了非常奇怪的行为,我只是不知道是什么导致了我的问题。我在代码中几乎可以看到的所有地方,但是找不到任何明显会导致此问题的东西。最后,我有一个网络专家建议它可能与NodeJS服务器上的负载平衡有关。我不确定这是否成立,但想告诉我这个问题,看看您是否有任何建议。
我们运行一个NodeJS / SocketIO应用程序,该应用程序基本上允许基于Web的管理应用程序监视用户在我们网站上的连接。实际上,应该做的就是接收传入的消息并重新格式化该消息,然后将其重新广播给所有正在实时侦听的客户端(这是我们所有基于Web的管理员)。本质上它是这样的...
用户(通过我们的网站之一)连接到NodeJS / SocketIO
服务器,并且该网站向NodeJS / SocketIO服务器发送一条消息,表明已建立连接。
NodeJS / SocketIO应用程序将一条简短消息记录到控制台,以告知
我们已建立连接。
然后,NodeJS / SocketIO应用重新格式化该消息并将该
消息发送给所有连接。
该消息包含NodeJS / SocketIO应用已接收到来自用户ip的连接的数据。
基于Web的管理员随后接收到该消息并更新其视图以显示所有当前连接的列表。
当用户断开连接时,NodeJS / SocketIO应用程序会向该客户端已断开连接的所有客户端发送一条新消息,并且基于Web的
管理员会收到这些消息,然后更新其视图。
我的问题是,当我在一个IP上的一台PC上运行基于Web的admin实例,然后在另一台PC和另一个IP上同时运行同一Web的admin的另一个实例时-两者同时-他们大多看不到相同的流量。在几乎每种情况下,来自用户的连接都会显示在一个或另一个基于Web的管理实例中,但很少见,这两个连接都按我的期望出现在两者中。似乎几乎所有来自NodeJS / SocketIO的消息都由一个基于Web的管理员接收,而另一个则没有,即使它们都应该侦听并接收相同的消息。我设计了代码,以便当NodeJS / SocketIO接收到连接时,它会将新的连接消息广播到所有正在侦听的客户端,这两个客户端都应包括基于Web的管理员,并且两个基于Web的管理实例都应查看所有传入的连接并更新其连接要匹配的视图。但是,这不会发生。这些消息几乎总是由基于Web的admin实例之一而不是其他实例接收。
但是,奇怪的是,当我在2台不同的PC上但在同一IP上运行2个基于Web的管理员实例时,两个基于Web的管理员都正确接收和处理了消息。如我所料,如果两个基于Web的管理员都在不同的IP上运行。
我们的网络专家建议,这可能与NodeJS服务器上的负载平衡有关。他建议,也许当基于Web的管理实例连接到NodeJS服务器时,它仅看到NodeJS服务器的一个实例,因此看不到可能在NodeJS服务器的另一实例上出现的所有连接。
服务器上运行的NodeJS / SocketIO应用看起来像这样...
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(process.env.PORT, function(){
console.log('listening on PORT:' + process.env.PORT);
});
io.on('connection', function(socket){
// Report a new connection and where it came from
var client_ip_address = socket.handshake.headers['x-forwarded-for'] || socket.request.socket.remoteAddress;
console.log("Connection from:" + client_ip_address);
socket.on('disconnect', function () {
emitMessageToAll({type: "disconnect", ip: client_ip_address, senderID: socket.id});
});
// After a new user connects, we wait for them to emit to us the website they are currently on before notifying all users (Admin)
// Of the new connection. That way Admin can filter users by what site & page they are currently on.
socket.on('newConnectionInfo',function(data){
console.log("User reports connection data: " + data.IP);
emitMessageToAll({type: "newConnection", ip: data.IP, url: data.url, senderID: socket.id});
});
socket.on('newBooking',function(data){
console.log("User reports new booking: " + data.IP);
emitMessageToAll({type: "newBooking", ip: data.IP,PurchDate: data.PurchDate, Surname: data.Surname});
});
});
function emitMessageToAll(data){
io.emit('message',data);
console.log("Sending:");
console.log(data);
}
无论如何,对于可能导致问题的原因,我完全感到困惑,您能提出任何可能导致此异常行为的想法吗?是负载平衡问题还是服务器相关问题?
因此,在我的案例中,答案是服务器的负载平衡允许运行NodeJS / SocketIO应用程序的多个实例。我们最多有3个实例同时运行,这导致一些连接通过实例1路由,一些通过实例2路由,另一些通过实例3路由。一旦关闭NodeJS / SocketIO应用程序的其他实例,问题便自行解决。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句