【问题标题】:Node js redis socket.io pubsub realtime updatesNode js redis socket.io pubsub 实时更新
【发布时间】:2012-07-30 09:38:55
【问题描述】:

您好,我正在为我的学校项目构建一个“Twitter 克隆”。

我想为实时更新实现发布订阅模式。

  • 用户可以“关注”其他用户
  • 当用户在线并且“关注者”发布新消息时,用户应该会收到实时通知。

我使用 Node.js、Socket.io、Redis 和 MySql 作为数据库提供程序。我应该使用消息队列吗?人们在使用消息队列吗?

感谢您的帮助和回答

【问题讨论】:

    标签: javascript node.js socket.io real-time publish-subscribe


    【解决方案1】:

    更新

    当你还小的时候,问题就不存在了。但是当你变大时,扇出(将消息转发给所有关注者将会很昂贵,并且你想使用 MQ 离线执行此操作。就像推特一样,你将所有活动推文存储在内存中。发布推文时,你放(set ) 内存中的那条推文@key(unique)。你可以使用类似 Twitter 的 snowflake 之类的东西。

    接下来是扇出过程。对于每个用户,您需要 put 他们列表中的唯一键(推文 ID),以便他们可以从内存中检索推文。当您的网站很小时,我想您可以在没有消息队列的情况下执行此操作,但是当您需要从具有 274,776 个关注者的用户(例如 scoble)分发消息并且发很多推文时,这可能会变得非常昂贵。

    很多用户处于离线状态,因此这些推文不需要立即发送给用户。你这样设计你的系统是因为你需要把所有的东西都保存在内存中。我认为这是有效地做到这一点的唯一方法。


    您应该像 twitter 一样使用 MQ。他们甚至开源了自己的 MQ:KestrelHigh Scalability 博客有一篇非常有趣的文章:Scaling Twitter: Making Twitter 10000 Percent Faster。我建议您至少在 High Scalability 博客上学习 hot articles,以了解大玩家如何扩展他们的网站。其他一些链接解释了Twitter scales

    我还假设您已经阅读:

    我还想看看 Twitter 开源的所有项目:

    我会看看流行的 MQ,例如:

    【讨论】:

    • 我就是不明白,我读过 MQ,但我不明白它的意义,在构建具有实时通知的系统时如何在实践中使用它?
    【解决方案2】:

    我最近研究了一个类似的用例,我使用了 nodejs、socketio 和 redis pubsub。

    代码位于https://github.com/roshansingh/realtime-notifications

    现在回到你的问题:

    • 用户可以“关注”其他用户
    • 当用户在线并且“关注者”发布新消息时,用户应该会收到实时通知。

    您可以通过使用 socketio 创建房间和在 redis pubsub 中创建同名频道来实现。

    流程可以是这样的: 您可以让用户在登录后立即加入 socketio 房间(比如 John、Dan 等),您将在数据库中保存他们所有订阅的房间。同时,您将使用这些频道名称(如 John)订阅 redis pubsub。收到这些更新后,可以将这些更新广播到房间,从而广播给所有在线用户。

    您必须将 John 在同一频道名称 (John) 上的活动发布到 redis。

    请阅读上面粘贴的链接上的代码。如果您需要任何帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2016-05-25
      • 2022-11-13
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2020-06-11
      相关资源
      最近更新 更多