【问题标题】:Node.js cluster passing connection to specific workerNode.js 集群将连接传递给特定的工作人员
【发布时间】:2016-09-01 11:29:30
【问题描述】:

我有基于 socket.io 库的多人游戏,我想在多个线程上扩展它。我了解到 node.js 有集群模块来处理多线程。 我的游戏世界由多个区域组成,我希望每个区域都在其自己的过程中进行处理。我需要一种将用户的套接字传递给特定工作人员的方法,以便用户可以从一个区域移动到另一个区域。 我在 node.js 文档中读到 cluster 模块使用循环方法为每个连接选择工作程序。也许有任何解决方法来操纵连接?

【问题讨论】:

  • 您可以发挥创造力并启动进程并通过某种队列(例如 0mq)与它们进行通信。它不是您要寻找的答案,但可能是回退
  • 嗨@akaphenom,谢谢你的回答。我以前从未听说过zmq。也许你有任何关于如何使用 zmq 和 node.js 处理类似情况的链接?
  • 我认为你可以通过使用像nginxHAProxy 这样的网络服务器来解决这个问题。您可以使用Docker 在每台服务器上启动同一应用程序的多个实例,然后使用nginxHAProxy 对其进行负载平衡。
  • @Gugis 你是怎么处理这个问题的?我也有类似的问题。

标签: node.js multithreading socket.io


【解决方案1】:

我不完全确定集群是适合您的解决方案。集群的主要优点是它可以自动平衡不同进程之间的传入连接。但是,您不想使用该功能 - 您想手动将每个连接分配给处理给定区域的进程。

因此,我认为您应该只启动所需数量的进程,为每个进程分配一个特定于该区域的端口,然后让客户端向主服务器发送 Ajax 请求,询问应该使用哪个端口他们为他们的区域建立了 socket.io 连接。客户端获取该 ajax 响应,然后直接连接到其区域的适当服务器。您的所有 socket.io 服务器都需要允许来自所需母版页域/端口的跨域请求。

连接到服务器的区域可以通过如上所述的端口完成,也可以通过单独的主机名完成,例如zone1.mygameserver.com,然后使用 nginx 之类的东西将所有不同的主机路由到您的特定端口服务器箱。

【讨论】:

  • 那么当用户想要退出一个区域并进入另一个客户端时,应该断开与当前区域服务器的连接并连接到新区域吗?但是如果区域之间的过渡必须是不可察觉的,没有加载屏幕等呢?
  • @Gugis - 你说的是 socket.io 连接。关闭一个 socket.io 连接并打开另一个连接对用户的屏幕或当前页面或任何内容完全没有影响,用户完全不可见。
  • 但是如何安全地转移会话?
  • @Gugis - 我不知道如何将套接字从一个集群进程转移到另一个。我的回答是建议您不必转移它的方式。你的主人告诉客户端直接连接到哪个区域服务器。而且,如果它想更改区域,服务器可以发送一条消息告诉它重新连接到一个新区域。只需创建与新区域的新连接应该没什么大不了的。
猜你喜欢
  • 2017-01-23
  • 2018-12-22
  • 2020-09-12
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
相关资源
最近更新 更多