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

5

人们通常使用 SocketIO 和 Node 构建的第一个应用程序通常是聊天应用程序。这个聊天应用程序基本上有一个节点服务器,会向多个客户端广播。在 Node 代码中,你会有一些像这样的东西。

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

这对于少量用户来说是很好的,但我看到了一个问题。首先,存在单点故障,即Node服务器。其次,应用程序会随着客户端数量的增加而变慢。当我们达到瓶颈时,有什么可以做的呢?是否有一种架构(水平/垂直扩展)可以用来缓解这个问题?


你预计会有多少客户端连接到服务器?为了使该循环明显变慢,我会说你需要几千个甚至数万个客户端。 - Some programmer dude
如果你有数百万的用户,那么这并不算太多了,对吧? - denniss
2个回答

4

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

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

它基本上是一个事件传递框架,用于在多个“事物”之间进行交流,如多个node服务器。

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

话虽如此,在你处理几千个同时在线用户和其他许多问题之前,你可能不会遇到使用它的问题。

另一件事是,你可以尝试以某种方式开发你的应用程序,以便在连接中断(这种情况经常发生),例如服务器崩溃,客户端存在网络问题(例如移动用户)等情况下,你的应用程序应该能够优雅地处理这些问题并从中恢复过来。


2
由于Node.js只有一个事件循环线程,因此这个单点故障被写入了它的DNA中。即使在代码更改后重新加载服务器也需要停止该线程。
然而,有许多可用的工具可以优雅地处理这些故障。您可以使用forever;这是一个简单的CLI工具,用于确保给定的脚本持续运行。其他选项包括distributeup。Distribute是一个用于Node的负载均衡中间件。Up在Distribute的基础上构建,使用JavaScript API或命令行界面提供零停机重新加载:
进一步阅读,我发现您只需要使用Redis Store和Socket.io来在两个或多个进程/服务器之间维护连接引用。这些选项已经在herehere中广泛讨论过。
还有一种选择,如果您不打算使用Redis存储,则可以使用socket.io-clusterhub

你是否尝试过使用分布式计算?我在想它如何能够广播给所有用户。似乎每个节点都必须知道所有已连接的用户。 - denniss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接