我一般都是Web套接字的新手,但主要是概念。
我正在尝试构建一个简单的多人游戏,并希望有一个服务器选择,我可以在多个IP上运行套接字,它将通过它连接客户端,以缓解连接以提高性能,这是假设的一次有成千上万的玩家的情况,但想要了解这将如何工作,如果有任何资源,我可以用来预先整合这个,以防止以后的额外工作。这是可能的,因为据我所知,Node.Js在服务器上运行并使用Socket.io依赖项在其中创建套接字,因此我无法想出可能的解决方案将其路由到另一台服务器,除非我有多个站点单独运行它。
答案 0 :(得分:2)
我的第一个问题是:
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请求分开。