首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS/SocketIO消息无法可靠传递

NodeJS/SocketIO消息无法可靠传递
EN

Stack Overflow用户
提问于 2016-03-02 05:03:00
回答 1查看 126关注 0票数 0

在我们的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管理实例时,然后在另一台PC上运行另一个基于同一个Web管理的实例,同时运行一个不同的IP --它们通常看不到相同的通信量。几乎在每一种情况下,来自用户的连接都显示在一个或另一个基于Web的管理实例中,但是很少会像我预期的那样在这两个实例中出现连接。似乎几乎所有来自NodeJS/SocketIO的消息都是由一个基于Web的管理员接收的,而不是另一个,尽管它们都应该侦听和接收相同的消息。我设计了代码,以便当NodeJS/SocketIO接收到连接时,它向所有正在侦听的客户端广播新的连接消息,这应该包括基于Web的管理员和两个基于Web的管理实例,它们都应该看到所有传入的连接,并更新它们的视图以匹配它们。然而,这种情况并没有发生。这些消息几乎总是由一个基于Web的管理实例而不是另一个实例接收。

奇怪的是,当我在两个不同的PC上运行两个基于管理的Web实例时,这些消息在两个基于Web的管理员中都被正确地接收和处理。正如我所预期的,如果两个基于Web的管理员都运行在不同的IP上。

我们的网络专家表示,这可能与NodeJS服务器上的负载平衡有关。他建议,当一个基于Web的管理实例连接到NodeJS服务器时,它只看到NodeJS服务器的一个实例,因此不能看到可能出现在另一个NodeJS服务器实例上的所有连接。

运行在服务器上的NodeJS/SocketIO应用程序如下所示.

代码语言:javascript
运行
复制
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);
} 

不管怎么说,我在这里完全搞不懂是什么原因造成了这个问题,你能不能提出一些可能导致这种奇怪行为的想法?这可能是负载平衡问题还是与服务器相关的问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-03 05:25:42

因此,在我的例子中,答案是服务器的负载平衡允许我们的NodeJS/SocketIO应用程序的多个实例运行。我们有多达3个实例同时运行,导致一些连接通过实例1路由,一些通过实例2,另一些通过实例3。一旦NodeJS/SocketIO应用程序的附加实例关闭,问题就自行解决了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35738886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档