节点js redis socket.io pubsub实时更新

时间:2012-07-30 09:38:56

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

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

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

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

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

感谢您的帮助和解答

2 个答案:

答案 0 :(得分:7)

<强>更新

当你小的时候问题不存在。但是当你变得很大时(向所有粉丝转发消息将会很昂贵,你想要使用MQ离线完成。像twitter一样,你将所有活动的推文存储在内存中。当你发布推文时你放({{3在内存中发送推文@key(唯一)。你可以使用Twitter的set之类的内容。

接下来,扇出过程发生了。对于每个用户,您需要snowflake列表中的唯一键(推文ID),以便他们可以从内存中检索推文。当你的网站很小时我想你可以在没有消息队列的情况下做到这一点,但是当你需要分发来自用户的消息时,例如put有274,776个粉丝,而且推文很多,这可能会非常昂贵。 / p>

许多用户处于离线状态,因此这些推文无需立即发送给用户。您可以像这样设计系统,因为您需要将所有内容保存在内存中。我认为这是有效实现这一目标的唯一方法。


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

的方式

我还假设您已阅读:

此外,我还要看看Twitter开源的所有项目:

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

答案 1 :(得分:0)

我最近处理过一个类似的用例,我使用了nodejs,socketio和redis pubsub。

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

现在回到你的问题:

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

您可以通过在redis pubsub中使用socketio和具有相同名称的频道创建房间来实现这两个目标。

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

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

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