因此,人们通常使用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。