将Backbone.iobind(socket.io)与一组node.js服务器一起使用

我使用Backbone.iobind将我的客户端骨干模型通过socket.io绑定到后端服务器,后端服务器又将这些模型存储到MongoDB中。 我使用的是socket.io,所以我可以将更改同步到其他客户端主干模型。

当我尝试在一个node.js服务器集群上运行同样的事情时,问题就开始了。 使用将会话存储到MongoDB的 connect-mongo可以轻松设置会话存储。 但是现在我不能通知所有的客户端,因为客户端分布在不同的node.js服务器之间。

我发现的唯一解决scheme是在不同的node.js服务器(例如mubsub )之间设置一个pub / sub队列,这似乎是一个非常重的解决scheme,每次更改都会触发所有服务器上的事件。

你是如何得出pub / sub是“非常重的解决scheme”的结论?
听起来像你直到这一部分:-)
哦,pub / sub 不是队列。

我们来看看这个说法:
发布/订阅的好处在于您可以发布和订阅频道/主题
因此,使用经典的聊天服务器示例,假设您有一百万个用户连接在一起,但#myroom中只有50个用户。
当邮件发送到#myroom时,它将被发布一次。 没有任何重复。
在大多数使用情况下,您甚至不需要将其存储在磁盘/ RAM上,所以我们主要在这里查看networking/带宽。 而且,我的意思是说,你可能已经把更多的数据(可能是通过电报?)传给了MongoDB,所以我认为这不是你的瓶颈。

如果你还使用socket.io的房间function(这基本上是它自己的pub / sub机制),这意味着只有5个用户将这个消息通过websocket发送给他们。
不,socket.io不会遍历1M客户端,以找出它们中的哪个在#myroom 😉
所以这个消息被发布一次,每个订阅者(node.js实例)将得到一次通知,并且只有相关的客户端 – socket.io将不会浪费CPU周期来find它们,因为它们在join时跟踪它们()或离开()房间 – 将收到消息。
这听起来不是很有效率和轻量级?

给Redis一枪。
它的设置非常简单,完全在内存中运行,速度非常快,复制非常简单等。

这就是socket.io build议在节点之间传递事件的方式。
你可以在这里find更多的信息/代码。

另外,如果MongoDB无法在任何时候处理负载,那么也可以使用Redis作为会话存储。

希望这可以帮助!