0

我正在尝试使用 socket.io + 集群来扩展一个聊天应用程序。子进程是否可以处理属于其进程 ID 的传入请求(分叉时分配)?
例如:

http://mydomain/calculate?process=1

上述请求仅由进程 1 处理,其他进程将忽略它。这样,我想确保同一个房间的请求由同一个进程处理,所以我可能不必使用 RedisStore 作为 socket.io 后端。

我也想知道 RedisStore 是如何工作的,因为在使用它时,我发现 io.sockets.manager.rooms 数据在所有进程中并不准确。

编辑:
换一种说法:集群主进程可以根据查询字符串将请求分派到不同的子进程吗?

4

1 回答 1

2

答案是否定的。操作系统在这种情况下负责负载平衡,为了处理查询字符串,您必须连接到 Web 服务器(在您的情况下为子进程)。

根据我的经验,我发现集群有点没用。生成多个 NodeJS 进程(在多个端口上)并在它们前面放置一个代理(nginx?)要容易得多。它简单且可扩展。

至于socket.io:我认为它不能与集群正常工作(因为共享全局变量,这会导致问题)。同样:产生单独的 NodeJS 进程应该可以解决问题。此外,一旦您达到必须扩展到多台机器的地步,它也会很有用。在这一点上,任何关于集群的技巧都对你没有帮助。

最后一点:socket.io 不能很好地扩展。我建议编写自己的 WebSocket 服务器(例如基于 WS)并实现自己的缩放机制。例如,基于 all-to-all UDP ping,在处理少量服务器(50?100?)时应该可以很好地扩展。

于 2012-11-21T09:24:55.630 回答