【问题标题】:Using Backbone.iobind (socket.io) with a cluster of node.js servers将 Backbone.iobind (socket.io) 与 node.js 服务器集群一起使用
【发布时间】:2014-02-05 21:29:55
【问题描述】:
我正在使用Backbone.iobind 将我的客户端Backbone models 通过socket.io 绑定到后端服务器,后端服务器又将其全部存储到MongoDB。
我正在使用 socket.io,因此我可以将更改同步回其他客户端 Backbone 模型。
当我尝试在 node.js 服务器集群上运行相同的东西时,问题就开始了。
使用connect-mongo 设置会话存储很容易,它将会话存储到MongoDB。
但现在我无法通知所有客户端每次更改,因为客户端分布在不同的 node.js 服务器之间。
我找到的唯一解决方案是在不同的 node.js 服务器之间设置一个发布/订阅队列(例如mubsub),这似乎是一个非常重量级的解决方案,每次更改都会在所有服务器上触发一个事件.
【问题讨论】:
标签:
node.js
mongodb
backbone.js
socket.io
publish-subscribe
【解决方案1】:
您是如何得出 pub/sub 是“重量级解决方案”这一结论的?
听起来你直到那部分才正确:-)
哦,pub/sub 不是队列。
让我们来看看这个说法:
发布/订阅的好处是您可以发布和订阅频道/主题。
因此,使用经典的聊天服务器示例,假设您总共连接了 100 万用户,但 #myroom 中只有 50 个用户。
当一条消息发送到#myroom 时,它会被发布一次。没有任何重复。
在大多数用例中,您甚至不需要将其存储在磁盘/RAM 上,因此我们主要关注的是网络/带宽。而且,我的意思是,您可能已经向 MongoDB 发送了更多数据(可能是通过网络传输?),所以我认为这不是您的瓶颈。
如果您还使用 socket.io 的房间功能(基本上是它自己的 pub/sub 机制),这意味着只有 5 个用户会通过 websocket 向他们发送该消息。
不,socket.io 不会迭代超过 100 万个客户端来找出他们中的哪些在房间#myroom ;-)
因此消息发布一次,每个订阅者(node.js 实例)都会收到一次通知,并且只有相关的客户端——socket.io 不会浪费 CPU 周期来找到它们,因为它会在它们加入时跟踪它们() 或 leave() 一个房间——将收到消息。
这听起来是不是非常高效和轻量级?
试一试 Redis。
设置非常简单,完全在内存中运行,速度极快,复制非常简单,等等。
这就是 socket.io recommends 在节点之间传递事件的方式。
您可以找到更多信息/代码here。
此外,如果 MongoDB 在任何时候都无法处理负载,您也可以使用 Redis 作为会话存储。
希望这会有所帮助!