在我们的NodeJS/SocketIO开发中,我遇到了非常奇怪的行为,我只是不知道是什么导致了我的问题。在我们的代码中,我几乎找遍了所有的地方,但是找不到导致这个问题的任何明显的东西。最后,我有一个网络专家建议,这可能与NodeJS服务器上的负载平衡有关。我不确定这是不是真的,但我想我会告诉你们这个问题,看看你们有没有什么建议。
我们运行一个NodeJS/SocketIO应用程序,它基本上允许我们的基于Web的管理应用程序监视用户在我们的网站上的连接。实际上,它所要做的就是接收传入的消息并重新格式化消息,然后将它们重新广播给所有实时侦听(这是我们所有基于Web的管理员)的客户端。本质上是这样的..。
我的问题是,当我在一个IP上运行一个基于一台PC的Web管理实例时,然后在另一台PC上运行另一个基于同一个Web管理的实例,同时运行一个不同的IP --它们通常看不到相同的通信量。几乎在每一种情况下,来自用户的连接都显示在一个或另一个基于Web的管理实例中,但是很少会像我预期的那样在这两个实例中出现连接。似乎几乎所有来自NodeJS/SocketIO的消息都是由一个基于Web的管理员接收的,而不是另一个,尽管它们都应该侦听和接收相同的消息。我设计了代码,以便当NodeJS/SocketIO接收到连接时,它向所有正在侦听的客户端广播新的连接消息,这应该包括基于Web的管理员和两个基于Web的管理实例,它们都应该看到所有传入的连接,并更新它们的视图以匹配它们。然而,这种情况并没有发生。这些消息几乎总是由一个基于Web的管理实例而不是另一个实例接收。
奇怪的是,当我在两个不同的PC上运行两个基于管理的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);
}
不管怎么说,我在这里完全搞不懂是什么原因造成了这个问题,你能不能提出一些可能导致这种奇怪行为的想法?这可能是负载平衡问题还是与服务器相关的问题?
发布于 2016-03-02 21:25:42
因此,在我的例子中,答案是服务器的负载平衡允许我们的NodeJS/SocketIO应用程序的多个实例运行。我们有多达3个实例同时运行,导致一些连接通过实例1路由,一些通过实例2,另一些通过实例3。一旦NodeJS/SocketIO应用程序的附加实例关闭,问题就自行解决了。
https://stackoverflow.com/questions/35738886
复制