NodeJS+SocketIO:扩展和防止单点故障



因此,人们通常使用SocketIO和Node构建的第一个应用程序通常是聊天应用程序。这个聊天应用程序基本上有一个节点服务器,可以向多个客户端广播。在Node代码中,您会得到类似的内容。

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

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

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

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

它基本上是一个事件发射框架,用于在多个"事物"(如多个节点服务器)之间进行交叉通信。

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

话虽如此,在你开始遇到问题之前,你可能需要有几千个同时使用的用户和很多其他问题。

你可以做的另一件事是,尝试以这样的方式开发你的应用程序,即如果连接丢失(无论如何都会发生这种情况),例如服务器故障、客户端出现网络问题(例如移动用户)等,你的应用程序应该能够处理这些问题,并从这些问题中优雅地恢复。

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

然而,有很多工具可以优雅地处理此类故障。你可以永远使用;一个简单的CLI工具,用于确保给定脚本连续运行。其他选项包括distribute和up。Distribute是Node的负载平衡中间件。在Distribute之上构建,使用JavaScript API或命令行界面提供零停机重新加载:

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

如果你不打算使用Redis商店,也可以选择使用socket.io-clusterhub。

最新更新