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

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

Stack Overflow用户
提问于 2016-03-01 21: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
代码运行次数:0
运行
AI代码解释
复制
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-02 21:25:42

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

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

https://stackoverflow.com/questions/35738886

复制
相关文章
C++核心准则Enum.8:只在必要时指定枚举值
Enum.8: Specify enumerator values only when necessary
面向对象思考
2020/03/25
5030
【100个 Unity小知识点】 | C#中通过 数字int值 获取 枚举Enum 中的数值
枚举 是 值类型 ,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储。
呆呆敲代码的小Y
2021/12/24
2.7K0
enum和int、string的转换操作
enum Countries { 中国 = 5, 美国, 俄罗斯, 英国, 法国 }
全栈程序员站长
2022/07/15
4150
Java中的按值传递
这个时候可能会有疑问了,为什么add方法可以修改List数组,但是append和addNum却没有修改传进来的值
俺也想起舞
2019/07/24
1.8K0
Java中只有按值传递,没有按引用传递!
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟悉的值传递的例子:
java达人
2018/01/31
1.1K0
Java中只有按值传递,没有按引用传递!
在JavaScript中仿真Java的enum
背景 最近开始做的一个项目使用facebook的ReactJS前端框架。发现经常使用react的keyMirror工具来定义一些枚举常量: var keyMirror = require('keyMirror'); var AppMode = keyMirror({ LOG_IN: null, SIGN_UP: null }); module.exports = AppMode; 其他JS代码对该枚举的引用大概如下代码: var AppMode = require('../const/app
老码农
2018/06/27
2.3K0
《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
步骤1:在Visual Studio 2019中创建新的asp.net Core项目
角落的白板报
2019/05/05
3.9K0
《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
MONGODB 可以在应用系统中作为核心数据库?
知道最近也会听到一个声音,MONGODB 不能在核心的系统使用, 哎, 2021年了,现在有些系统都没有传统数据库的身影,而代替的是通过ES,REDIS ,Aerospike 这样的数据库来成功上位到这个系统的核心数据库, 那么MONGODB 为什么不可以成为项目的核心数据库?
AustinDatabases
2021/06/10
1.4K0
MONGODB   可以在应用系统中作为核心数据库?
《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)
步骤1:在Visual Studio 2017中创建新的asp.net Core项目
角落的白板报
2019/05/05
2.8K0
《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)
【译】在列表视图中处理空值
本篇文章主要针对两类开发者。第一个是曾遇到过IllegalArgumentException: Path must not be empty问题的开发者。第二个则是当ListView使用了未被完整加载的图像,应用程序仍能正确运转的开发者们。
小鄧子
2018/08/20
1.2K0
Selenium中单击Element:ElementClickInterceptedException
element = driver.find_element_by_css(‘div[class*=”loadingWhiteBox”]’)
kirin
2021/04/02
1.1K0
Golang 中函数作为值与类型
在 Go 语言中,我们可以把函数作为一种变量,用 type 去定义它,那么这个函数类型就可以作为值传递,甚至可以实现方法,这一特性是在太灵活了,有时候我们甚至可以利用这一特性进行类型转换。作为值传递的条件是类型具有相同的参数以及相同的返回值。
张乘辉
2019/06/14
1.7K0
ASP.NET Core 5.0 MVC中的视图分类及使用——布局视图、启动视图、导入视图、详细视图、分部视图
我们可以在这个页面,添加一些全局性的内容,比如全局变量等,然后在具体View页面使用这些变量值
明志德道
2023/10/21
4110
ASP.NET Core 5.0 MVC中的视图分类及使用——布局视图、启动视图、导入视图、详细视图、分部视图
Java中int和Integer值之间相互比较
请同时参考文章https://www.joshua317.com/article/200
joshua317
2021/11/30
6090
Java中int和Integer值之间相互比较
JavaScript 按值传递 & 按引用传递
其次,对象的比较并非值的比较:对象的比较均是引用的比较,当且仅当它们引用同一个基对象时,它们才相等。     即使两个对象包含同样的属性和相同的值,它们也是不相等的。各个索引元素完全相等的两个数组也不相等
书童小二
2018/09/03
3.8K0
hastable按值排序
最近做了一个项目,需要对一个2维数组的值进行排序然后再取出对应的Key值。开始是用HashTable做的,不过HashTable中的排序只是对Key进行排序,如果想对值进行排序得用其它办法。下面我就把这种方法说下:
codeniu
2022/02/25
1.3K0
ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
本篇代码基于以下代码进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02
KenTalk
2018/11/09
2.3K0
ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
Python 学习入门(34)—— PyDev 调试
Pydev 还提供一种特有的源程序运行功能 Run As Python Coverage,该功能不仅能显示出程序的运行结果,而且能将程序运行过程中代码的覆盖率显示出来。要查看代码的覆盖率,首先需要打开 Code Coverage,在 Pydev 透视图中,选择 Windows -> Show View -> Code Coverage
阳光岛主
2019/02/18
8990
Python 学习入门(34)—— PyDev 调试
C++核心准则Enum.5: 不要使用全部大写的枚举值
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#enum5-dont-use-all_caps-for-enumerators
面向对象思考
2020/03/25
7650
点击加载更多

相似问题

使用Enum作为int值

32

Enum值在剃须刀页ASP.NET核心3.1上不显示ASP.NET值

12

ASP.NET核心JSON模型将int绑定到enum

12

在asp.net核心剃须刀页面上使用局部视图

12

ASP.NET核心剃须刀视图没有显示在浏览器中

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文