Node js redis socket.io pubsub实时更新

Node js redis socket.io pubsub realtime updates

本文关键字:pubsub 实时更新 io socket js redis Node      更新时间:2024-04-19

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

我想实现一个用于实时更新的发布-订阅模式。

  • 用户可以"关注"其他用户
  • 当用户在线时,"追随者"发布了一条新消息,用户应该得到实时通知

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

感谢您的帮助和回答

更新

当你很小的时候,问题就不存在了。但是,当你变得庞大时,扇出(向所有关注者转发消息)将是昂贵的,并且你想使用MQ离线完成这项工作。就像推特一样,你将所有活动的推文存储在内存中。当推文发布时,你将推文放(设置)在内存@key(唯一)中。你可以使用类似Twitter的雪花之类的东西。

接下来是扇出过程。对于每个用户,您需要将该唯一密钥(tweet id)放在他们的列表中,以便他们可以从内存中检索tweet。当你的网站很小的时候,我想你可以在没有消息队列的情况下做到这一点,但当你需要从一个拥有274776名粉丝的用户那里分发消息时,这可能会非常昂贵。

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


您应该像twitter一样使用MQ。他们甚至开源了自己的MQ:Kestrel。High Scalability博客有一篇非常有趣的文章:扩展Twitter:使Twitter速度提高10000%。我建议你至少研究一下High Scalability博客上的热门文章,了解大玩家是如何扩展他们的网站的。其他一些解释推特规模的链接:

  • http://highscalability.com/blog/2009/10/13/why-are-facebook-digg-and-twitter-so-hard-to-scale.html
  • http://highscalability.com/blog/2011/12/19/how-twitter-stores-250-million-tweets-a-day-using-mysql.html
  • http://highscalability.com/blog/2009/4/20/some-things-about-memcached-from-a-twitter-software-develope.html

我还假设你已经读过:

  • http://redis.io/topics/twitter-clone

此外,我会看看推特开源的所有项目:

  • https://github.com/twitter

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

  • Redis
  • Beanstalkd
  • Gearman

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

代码可在https://github.com/roshansingh/realtime-notifications.

现在回到您的问题:

  • 用户可以"关注"其他用户
  • 当用户在线时,"追随者"发布了一条新消息,用户应该得到实时通知

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

流量可以是这样的:您可以让用户一登录就加入socketio房间(比如John、Dan等),您将把他们订阅的所有房间保存在数据库中。同时,您将使用这些频道名称(如John)订阅redis-pubsub。当接收到这些更新时,这些更新可以被广播到房间,并因此被广播到所有在线用户。

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

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