我使用 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/