【问题标题】:Socket.io and Node.Js multiple serversSocket.io 和 Node.Js 多服务器
【发布时间】:2016-11-08 18:40:11
【问题描述】:

一般来说,我是 Web Sockets 的新手,但了解主要概念。

我正在尝试构建一个简单的多人游戏,并希望有一个服务器选择,我可以在其中运行多个 IP 上的套接字,它将通过它连接客户端,以减轻连接以提高性能,这是假设的同时有数千名玩家的情况,但想了解它是如何工作的,以及是否有任何资源我可以用来预先整合它,以防止以后的额外工作。这完全可能吗,据我了解,Node.Js 在服务器上运行并使用 Socket.io 依赖项在其中创建套接字,所以我想不出一个可能的解决方案来通过另一台服务器路由它,除非我有多个网站单独运行。

【问题讨论】:

  • 看看this写的。这是一个利用节点的cluster 能力水平扩展的实现。这不是您所要求的完全,但这是朝着这个方向迈出的一步。

标签: javascript node.js sockets socket.io server


【解决方案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 请求分开。

【讨论】:

  • 我对除了 PHP 之外的任何服务器端都不太先进,所以这对我来说是一个巨大的学习曲线。目前在本地数据中心上运行,所以这不是问题。就我目前的理解而言,这似乎有点复杂,但我将阅读它并希望解决它,感谢您的详细回复,您是否认为 Node.Js 集群也是一个合适的解决方案,因为在对我的问题的评论回复中引用?
  • 嗨,Danny,集群在很多事情上都非常有用,但您需要了解尝试将集群与 Socket.io 一起使用的人们所面临的问题。只要你能牢牢把握你的 websocket 请求的去向,你应该没问题。请记住:从单个 Node 服务器跳转到多个 Node/Clusters/Workers 的那一刻,您将面临 Socket 升级问题。这个博客是一个很好的起点。 goldfirestudios.com/blog/136/…
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2016-05-11
  • 2016-05-24
  • 2012-01-27
  • 2014-03-13
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多