3

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

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

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

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

感谢您的帮助和回答

4

2 回答 2

7

更新

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

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

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


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

我还假设您已阅读:

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

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

于 2012-07-31T06:22:05.757 回答
0

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

该代码可在https://github.com/roshansingh/realtime-notifications获得。

现在回到你的问题:

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

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

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

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

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

于 2013-01-15T14:50:13.533 回答