【问题标题】: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 作为会话存储。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2018-12-15
      • 2017-11-05
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      相关资源
      最近更新 更多