2014-02-05 76 views
1

我使用Backbone.iobind将我的客户端Backbone models通过socket.io绑定到后端服务器,后端服务器又将其全部存储到MongoDB。 我使用的是socket.io,因此我可以将更改同步回其他客户端主干模型。将Backbone.iobind(socket.io)与node.js服务器集群一起使用

当我尝试在一个node.js服务器集群上运行同样的事情时,问题就开始了。 使用connect-mongo设置会话存储非常简单,它将会话存储到MongoDB。 但是现在我无法通知所有客户端每次更改,因为客户端分布在不同的node.js服务器之间。

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

回答

1

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

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

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

给Redis一枪。
这是非常简单的设置,完全运行在内存,超快的,复制是非常简单的,等

这是socket.io recommends通过节点间事件的方式。
你可以找到更多的信息/代码here

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

希望这会有所帮助!