2016-07-06 90 views
0

我是一般的Web套接字的新手,但得到的主要概念。Socket.io和Node.Js多个服务器

我想构建一个简单的多人游戏,并希望有一个服务器选择,我可以在多个IP上运行套接字,并通过它连接客户端,以减轻连接以提高性能,这是假设的在数千名玩家同时参与的情况下,希望能够深入了解这将如何工作,以及是否有任何资源可以用于事前整合,以防止在以后的日子里进行额外的工作。这是否完全可能,据我了解,Node.Js在服务器上运行,并使用Socket.io依赖关系在其中创建套接字,所以我想不出一种可能的解决方案将它通过另一台服务器,除非我有多个网站单独运行。

+0

看看[this](https://github.com/elad/node-cluster-socket.io)写下来。这是一个利用节点“集群”功能水平扩展的实现。这不是你所要求的,而是朝着这个方向迈出的一步。 – dvlsg

回答

1

的第一个问题我是这样的:

Are you hosting on AWS or in a local datacenter?

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

A) Modify elastic load balancer policies to forward protocol information B) Split apart TCP connections from standard web requests using something like HA PROXY or NGINX. This is necessary in order to handle web socket UPGRADE requests properly, as you will be setting TCP to sticky and web requests to round-robin. C) Attach your socket.io configuration to a common storage source, like Redis (elasticache).

一旦你想通了什么需要的AWS(或者,如果你有过请求路由完全控制你的本地数据中心),您需要构建您的SOCKET应用程序以使用多播室而不是直接套接字消息。

例子: To send a message to users in game #4444, emit a message to room 'games:4444', rather than direct to the user's socket.

如果您的插座实例使用Redis的配置,Redis的将自动完成维护谁连接到你的人名单“游戏:4444”通道。否则,您需要使用数据库或其他共享机制来维护自己的列表。

除此之外,网上有大量的资源可以帮助您找出每一步。我首先了解一下诸如HA PROXY之类的东西,以及它如何帮助将您的SOCKETS从Web请求中分离出来。

+0

除了PHP之外,我并没有太高级的服务器端,所以这对我来说是一个巨大的学习曲线。目前在本地数据中心上运行,所以这不是问题。这对我目前的理解来说似乎有点复杂,但是我会仔细阅读并希望得到它,感谢您的详细回复,您认为Node.Js集群也是一个适合此解决方案的解决方案,因为在评论回复我的问题引用? – Danny

+0

嗨Danny,集群对很多事情都很棒,但是你会想读一些试图用Socket.io进行集群的人面对的问题。只要你能够紧紧抓住你的websocket请求的位置,你应该没问题。请记住:从单个节点服务器跳转到多个节点/群集/工作者的那一刻,您将面临套接字升级问题。这个博客是一个开始的好地方。 http://goldfirestudios.com/blog/136/Horizo​​ntally-Scaling-Node.js-and-WebSockets-with-Redis –

相关问题