如何在节点实例之间切换连接的套接字?

时间:2016-04-18 21:54:57

标签: node.js nginx redis

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

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

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

在10名玩家连接后,他们以循环方式分发。对于所有Redis个实例,我也使用Pub/Sub node

我很想知道实例9300上的连接播放器是否可能,切换到9302而不丢失连接?

推理是因为我的游戏是基于实例的。我有“游戏”,如果你愿意的话,玩家可以创建或加入。如果我可以将连接的播放器放到他们游戏的同一节点实例上,我会减少所有额外的Pub/Sub信号并获得更好的延迟。 (或者我认为,但只是好奇这是否可能)

1 个答案:

答案 0 :(得分:1)

  

我很好奇连接的播放器是否可能启用   实例9300,在没有丢失连接的情况下切换到9302?

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

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