node.js - 如何在 Node 实例之间切换连接的套接字?

标签 node.js nginx redis

我使用 pm2 旋转了 3 个 Node 实例。他们都在使用这些端口运行 websocket 服务器:(9300、9301 和 9302)。

我的主服务器充当 nginx 负载平衡器。 nginx 上游 block :

upstream websocket { 
    least_conn;
     server 127.0.0.1:9300;  
     server 127.0.0.1:9301; 
     server 127.0.0.1:9302; 
}

10名玩家连线后,以循环方式分配。我还利用 Redis 为所有 node 实例提供 Pub/Sub

我很好奇是否有可能让处于 9300 实例的已连接播放器切换到 9302 而不会失去连接?

原因是因为我的游戏是基于实例的。如果你愿意,我有“游戏”,玩家可以创建或加入。如果我可以让已连接 玩家在他们游戏的同一 Node 实例上,我将减少所有额外的Pub/Sub 信号并实现更好的延迟。 (或者我认为,但只是好奇这是否可能)

最佳答案

I am curious if it's possible for a connected player that is on instance 9300, switch to 9302 while not losing their connection?

不,这是不可能的。 TCP 套接字是两个特定端点之间的连接,建立后不能从一个端点移动到另一个端点。禁止这样做有很好的安全原因(因此连接不会被劫持)。

解决此问题的通常方法是让服务器告诉客户端重新连接并向其提供有关如何连接到您希望它连接到的特定服务器的说明(例如连接到特定端口或特定主机名或其他一些方式您的负载均衡器可能会使用)。

关于node.js - 如何在 Node 实例之间切换连接的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36704974/

相关文章:

django - wkhtmltopdf (pdfkit) 无法连接到任何 X 显示器

django - 如何在 Django 中通过 HTTPResponse 返回缓存的 JSON 数据?

iphone - Redis 对比iOS 应用程序中推送通知的 Web 服务

javascript - 无法为node.js安装node-steam

ruby-on-rails - nginx 错误 : (13: Permission denied) while connecting to upstream)

mysql - Express.js/Node.js 与 mysql

docker - Nginx-单击 anchor 链接时,Localhost端口丢失

docker - redis:调用 tcp [REDIS ADDRESS] connect:连接被拒绝

node.js - 查询 MongoDb 以从引用 id 数组的集合中获取计数

javascript - Gulp:构建 typescript 项目正在创建权限问题