Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.io和Node.Js多个服务器_Javascript_Node.js_Sockets_Socket.io_Server - Fatal编程技术网

Javascript Socket.io和Node.Js多个服务器

Javascript Socket.io和Node.Js多个服务器,javascript,node.js,sockets,socket.io,server,Javascript,Node.js,Sockets,Socket.io,Server,一般来说,我不熟悉Web套接字,但了解主要概念 我正在尝试建立一个简单的多人游戏,并希望有一个服务器选择,我可以在多个IP上运行套接字,它将通过该服务器连接客户端,以减少连接以提高性能,这是假设的情况下,同时有数千名玩家,但我想了解一下这是如何工作的,如果有任何资源我可以在手之前集成它,以防止以后额外的工作。据我所知,Node.Js运行在一台服务器上,并使用Socket.io依赖项在其中创建套接字,所以我想不出一个可能的解决方案来将其路由到另一台服务器,除非我有多个站点分别运行它。我的第一个问题

一般来说,我不熟悉Web套接字,但了解主要概念


我正在尝试建立一个简单的多人游戏,并希望有一个服务器选择,我可以在多个IP上运行套接字,它将通过该服务器连接客户端,以减少连接以提高性能,这是假设的情况下,同时有数千名玩家,但我想了解一下这是如何工作的,如果有任何资源我可以在手之前集成它,以防止以后额外的工作。据我所知,Node.Js运行在一台服务器上,并使用Socket.io依赖项在其中创建套接字,所以我想不出一个可能的解决方案来将其路由到另一台服务器,除非我有多个站点分别运行它。

我的第一个问题是:

您是在AWS上托管还是在本地数据中心托管?

我之所以问这个问题,是因为SOCKET.io需要粘性会话才能跨多台服务器正常工作。由于SOCKET.io将尝试升级每个连接,并且由于升级请求必须到达授权会话的原始服务器,因此您需要通过粘性会话将websocket(TCP)连接路由回该原始服务器。不幸的是,AWS让这变得非常棘手,需要您学习如何:


A) 修改弹性负载平衡器策略以转发协议信息
B) 使用HA代理或NGINX之类的工具将TCP连接与标准web请求分离。这是正确处理web套接字升级请求所必需的,因为您将TCP设置为sticky,web请求设置为round robin。
C) 将socket.io配置连接到公共存储源,如Redis(elasticache)。

一旦您确定了AWS需要什么(或者如果您已经完全控制了本地数据中心的请求路由),您将希望构建套接字应用程序以使用多播室而不是直接套接字消息传递

例如:

要在game#4444中向用户发送消息,请将消息发送到房间“games:4444”,而不是直接发送到用户的套接字。

如果您的套接字实例是使用REDIS配置的,REDIS将自动维护连接到“games:4444”频道的人员列表。否则,您需要使用数据库或其他共享机制自己维护列表


除此之外,网上还有大量的资源可以帮助你找出前进的每一步。我首先要了解HA代理之类的东西,以及它如何帮助将套接字从web请求中分离出来

看一看你的评论。它是一个利用节点的
集群
能力水平扩展的实现。这并不是你想要的,但这是朝着这个方向迈出的一步。除了PHP之外,我对服务器端的任何东西都不太在行,所以这对我来说是一个巨大的学习曲线。目前正在本地数据中心运行,因此这不是问题。就我目前的理解而言,这似乎有点复杂,但我将仔细阅读并解决它,希望,感谢您的详细回复,您认为Node.Js群集是否也适合解决这个问题,正如在对我问题的评论回复中提到的那样?嗨,Danny,群集在很多方面都很好,但是,您需要了解那些试图使用Socket.io集群的人所面临的问题。只要您能够严格控制websocket请求的去向,就应该可以了。请记住:当您从单个节点服务器跳到多个节点/集群/工作者时,您将面临套接字升级问题。这个博客是一个很好的开始。