您好我正在为我的学校项目建立一个“Twitter克隆”。
我想为实时更新实现发布订阅模式。
我使用Node.js,Socket.io,Redis和MySql作为数据库提供程序。我应该使用消息队列吗?人们使用消息队列是什么?
感谢您的帮助和解答
答案 0 :(得分:7)
<强>更新强>
当你小的时候问题不存在。但是当你变得很大时(向所有粉丝转发消息将会很昂贵,你想要使用MQ离线完成。像twitter一样,你将所有活动的推文存储在内存中。当你发布推文时你放({{3在内存中发送推文@key(唯一)。你可以使用Twitter的set之类的内容。
接下来,扇出过程发生了。对于每个用户,您需要snowflake列表中的唯一键(推文ID),以便他们可以从内存中检索推文。当你的网站很小时我想你可以在没有消息队列的情况下做到这一点,但是当你需要分发来自用户的消息时,例如put有274,776个粉丝,而且推文很多,这可能会非常昂贵。 / p>
许多用户处于离线状态,因此这些推文无需立即发送给用户。您可以像这样设计系统,因为您需要将所有内容保存在内存中。我认为这是有效实现这一目标的唯一方法。
你应该像twitter一样使用MQ。他们甚至开源了他们自己的MQ:scoble。 Kestrel博客有一篇非常有趣的文章: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。
请阅读上面粘贴的链接上的代码。如果您需要任何帮助,请告诉我。