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

时间:2014-02-05 21:29:56

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

我正在使用Backbone.iobind将我的客户端Backbone models通过socket.io绑定到后端服务器,而后端服务器又将所有内容存储到MongoDB。 我正在使用socket.io,因此我可以将更改同步回其他客户端Backbone模型。

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

我找到的唯一解决方案是在不同的node.js服务器(例如mubsub)之间设置发布/订阅队列,这似乎是一个非常重的解决方案,它将在所有服务器上触发事件每一次改变。

1 个答案:

答案 0 :(得分:1)

你是如何得出pub / sub是一个“非常重的解决方案”的结论? 听起来你直到那部分才得到它:-)
哦,pub / sub 一个队列。

让我们检查一下这个说法:
pub / sub的好处在于您发布和订阅频道/主题 因此,使用经典聊天服务器示例,假设您总共有一百万用户连接,但#myroom只有50个用户。 当消息发送到#myroom时,它会被发布一次。没有重复。
在大多数用例中,您甚至不需要将其存储在磁盘/ RAM上,因此我们主要关注网络/带宽。而且,我的意思是,你可能已经向MongoDB投入了更多的数据(可能是通过线路?),所以我认为这不是你的瓶颈。

如果您还使用socket.io的房间功能(基本上是它自己的发布/订阅机制),这意味着只有5个用户将通过websocket向他们发送该消息。
不,socket.io不会迭代超过1M的客户端,以找出他们中的哪些客房#myroom ;-)
因此消息发布一次,每个订阅者(node.js实例)将收到一次通知,并且只有相关客户端 - socket.io不会浪费CPU周期来查找它们,因为它们在加入时会跟踪它们()或离开()房间 - 将收到消息 这听起来不是很有效且重量轻吗?

给Redis一个机会 设置非常简单,完全在内存中运行,速度极快,复制非常简单等。

这就是socket.io recommends在节点之间传递事件的方式 您可以找到更多信息/代码here

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

希望这有帮助!

相关问题