NodeJS + SocketIO:缩放和防止单点故障

所以人们通常使用SocketIO和Node构build的第一个应用程序通常是一个聊天应用程序。 这个聊天应用程序基本上有1个节点服务器,将广播到多个客户端。 在节点代码中,你会有类似的东西。

//Psuedocode for(client in clients){ if(client != messageSender){ user.send(message); } } 

这对于less数用户来说很好,但是我看到了一个问题。 首先,Node服务器有一个单点故障。 其次,随着客户数量的增长,应用程序将会减速。 当我们到达这个瓶颈时,那么我们该怎么做呢? 有没有可以用来缓解这个问题的架构(水平/垂直缩放)?

       

网上收集的解决方案 "NodeJS + SocketIO:缩放和防止单点故障"

对于那个“有一天”,当你的聊天应用程序需要多个容错节点服务器,并且你想使用socket.io在服务器和客户端之间进行交叉通信时,就有一个适合这个账单的node.js模块。

https://github.com/hookio/hook.io

它基本上是一个事件发射框架,可以在多个“事物”之间进行交互通信,例如多节点服务器。

与大多数模块相比,使用起来相对复杂,这是可以理解的,因为这是一个复杂的问题。

也就是说,在开始出现问题之前,您可能需要同时使用几千个用户和其他许多问题。

你可以做的另一件事是尝试开发你的应用程序,以便如果连接丢失(无论如何总是发生),例如。 服务器故障,客户端有networking问题(如移动用户)等,你的应用程序应该能够处理,并从这些问题恢复优雅。

由于Node.js有一个单一的事件循环线程,这个单点故障被写入到它的DNA中。 即使在代码更改后重新加载服务器,也需要停止此线程。

然而,有很多工具可以正常处理这样的故障。 你可以永远使用 一个简单的CLI工具,用于确保给定的脚本持续运行。 其他选项包括分发和注册 。 分发是Node的负载均衡中间件。 使用JavaScript API或命令行界面,在Distribute基础上构build零停机时间重新加载:

进一步阅读我发现你只需要使用Redis Store和Socket.io来维护两个或多个进程/服务器之间的连接引用。 这些和这里已经广泛讨论了这些选项。

如果您不打算使用Redis存储,也可以select使用socket.io-clusterhub 。