我正在尝试使用socket.io + cluster扩展聊天应用。子进程是否有可能处理传入请求属于其进程ID(fork时分配)?
例如:
http://mydomain/calculate?process=1
上述请求仅由进程1处理,其他进程将忽略它。通过这种方式,我想确保同一个房间的请求由同一个进程处理,因此我可能不必使用RedisStore作为socket.io后端。
我也想知道RedisStore是如何工作的,因为在使用它时,我发现io.sockets.manager.rooms数据在所有过程中都不准确。
修改
换句话说:可以根据查询字符串将主进程调度请求集群到不同的子进程吗?
答案 0 :(得分:2)
答案是否。操作系统负责在这种情况下进行负载平衡,并且为了处理查询字符串,您必须将其连接到Web服务器(在您的情况下为子进程)。
根据我的经验,我觉得群集有点无用。产生多个NodeJS进程(在多个端口上)并在它们前面放置代理(nginx?)要容易得多。它简单易用。
至于socket.io:我认为它不适用于集群(因为共享全局变量,这会导致问题)。再次:产生单独的NodeJS进程应该解决问题。此外,当您必须扩展到多台计算机时,它将非常有用。任何有群集的技巧都无法帮助你。
最后一点:socket.io不能很好地扩展。我建议编写自己的WebSocket服务器(例如based on WS)并实现自己的扩展机制。例如,基于全对UDP ping,在处理少量服务器时应该可以很好地扩展(50?100?)。