因此人们通常使用SocketIO和Node构建的第一个应用程序通常是聊天应用程序。这个聊天应用程序基本上有1个节点服务器,将广播到多个客户端。在Node代码中,你会有类似的东西。
//Psuedocode
for(client in clients){
if(client != messageSender){
user.send(message);
}
}
这对于少量用户来说非常有用,但我发现这有问题。首先,存在单点故障,即节点服务器。其次,随着客户数量的增长,应用程序将会放慢速度。当我们遇到这个瓶颈时,有什么可以做的?是否有可用于缓解此问题的架构(水平/垂直缩放)?
答案 0 :(得分:4)
对于那个“有一天”当你的聊天应用程序需要多个容错节点服务器,并且你想使用socket.io来交叉服务器和客户端之间的通信时,有一个node.js模块适合于纸币。
https://github.com/hookio/hook.io
它基本上是一个事件发射框架,用于在多个“事物”之间进行交叉通信 - 例如多个节点服务器。
与大多数模块相比,它使用起来相对复杂,这是可以理解的,因为这是一个需要解决的复杂问题。
话虽如此,在您开始遇到问题之前,您可能不得不同时拥有几千个用户和许多其他问题。
您可以做的另一件事是尝试以某种方式开发您的应用程序,以便在连接丢失时(无论如何都会发生),例如。服务器出现故障,客户端出现网络问题(例如移动用户)等,您的应用程序应该能够处理这些问题并优雅地从这些问题中恢复。
答案 1 :(得分:2)
由于Node.js只有一个事件循环线程,因此将这个单点故障写入其DNA中。甚至在代码更改后重新加载服务器也需要停止此线程。
但是有很多工具可以优雅地处理这些故障。你可以使用forever;一个简单的CLI工具,用于确保给定脚本连续运行。其他选项包括distribute和up。 Distribute是Node的负载平衡中间件。在Distribute之上构建,使用JavaScript API或命令行界面提供零停机重新加载:
进一步阅读我发现您只需要使用带有Socket.io的Redis Store来维护两个或多个进程/服务器之间的连接引用。这些选项已经被广泛讨论here和here。
如果您不打算使用Redis商店,还可以选择使用socket.io-clusterhub。