【问题标题】:NodeJS + SocketIO: Scaling and preventing single point of failureNodeJS + SocketIO:扩展和防止单点故障
【发布时间】:2012-04-01 17:05:13
【问题描述】:

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

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

这对于少数用户来说非常有用,但我发现这有问题。首先,存在单点故障,即节点服务器。其次,随着客户数量的增长,该应用程序将变慢。当我们遇到这个瓶颈时,该怎么办?有没有可以用来缓解这个问题的架构(水平/垂直缩放)?

【问题讨论】:

  • 您希望有多少客户端连接到服务器?要使该循环明显变慢,我会说您需要数千甚至数万。
  • 如果你有数百万用户,那不是很多吗?

标签: node.js socket.io publish-subscribe


【解决方案1】:

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

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

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

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

话虽如此,在您开始遇到此问题之前,您可能必须同时拥有几千个用户和许多其他问题。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你有没有尝试过使用分发?我只是想知道它如何能够向所有用户广播。似乎每个节点都必须知道所有连接的用户。
    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 2017-12-19
    • 1970-01-01
    • 2018-10-16
    • 2013-01-29
    • 2013-04-25
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多