2012-07-30 103 views
3

嗨,我正在为我的学校项目构建一个“Twitter克隆”。Node js redis socket.io pubsub实时更新

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

  • 用户可以“跟随”其他用户
  • 当用户在线时,和一个“跟随者”的帖子一个新的消息时,用户应该得到实时通知。

我使用Node.js,Socket.io,Redis和MySql作为数据库提供程序。我应该使用消息队列,以及使用消息队列的人是什么?

感谢您的帮助和答案

回答

7

更新

的问题是不存在的,当你很小。但是,当你变得更大时,转发消息给所有追随者将会很昂贵,并且你希望使用MQ离线执行此操作,就像twitter一样,你可以将所有活动推文存储在内存中,当你发布推文时,你把(set)推特在内存@key(唯一的)。你可以使用类似Twitter的snowflake了点。

下一页扇出过程发生。对于每一个用户,你需要put,在他们的名单唯一的密钥(推特ID),使他们能够当你的网站很小时,我想你可以在没有消息队列的情况下做到这一点,但是当你需要分发一个用户的消息,例如scoble和274,776个关注者,以及谁推文很多,这可能会非常昂贵。

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


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

我还假设您已经阅读:

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

我会看看流行的MQS例如像:

+0

我只是不明白,我已经阅读了关于MQ的,但我不明白它的重点,我怎么能在实际使用通知时构建系统时使用它? – onlineracoon 2012-07-31 09:33:39

+0

希望更清晰地更新答案... – Alfred 2012-07-31 10:44:42

0

我最近在一个类似的用例上工作过,我使用了nodejs,socketio和redis pubsub。代码https://github.com/roshansingh/realtime-notifications

现在回到你的问题:

  • 用户可以“跟随”其他用户
  • 当用户在线时,和一个“跟随者”的帖子一个新的消息,用户应获得实时通知。

您可以通过在redis pubsub中使用socketio和具有相同名称的通道来创建房间。

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

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

请阅读上面粘贴的链接上的代码。让我知道你是否需要任何帮助。