每个用户的 Socket.io 频道通知

3
我是一名经验不足的开发人员,刚开始学习node.js和socket.io。
我想为每个用户制作通知,如果他们的墙上有帖子或有人回复(评论)了用户的帖子,就像脸*书/谷*歌+通知那样。
我在这里遵循教程 http://www.codesizzle.com/node-js-and-socket-io/
我将它与laravel4和redis结合使用,redis作为发布消息/通知到redis的处理程序,然后nodejs将侦听redis,如果有post/event,然后使用socket io将其发送到用户的浏览器。
根据我的理解,例如:
1.用户A向用户B发布内容 2.用户B收到消息,说“用户A已在您的墙上发布了内容”
为了实现这一目标:
我需要让用户B订阅自己的频道,可能使用他的ID,然后当用户A发布某些内容时,laravel4将接收ajax post数据,将文章插入MySQL,并将用户的ID + 他的文章发布到redis,之后nodejs将接收事件并将其发布到用户B的浏览器。
我的问题是在我的语句中,“userB订阅自己的频道,可能使用他的id。”这意味着用户B将订阅频道,例如notif-channel-{userId}-> notif-channel-967,如果我有成千上万的用户,那么我将拥有成千上万个不同的通道,可能从notif-channel-1直到notif-channel-50000,
这会成为一个问题吗?
最佳实践是什么?
流程已正确吗?
谢谢你。
注:抱歉英文不好。
更新:
阅读了更多文章后,我认为我会改变流程:
1.用户A在用户B的墙上发布内容 2.然后将ajax post发送给laravel,以便我可以将消息/帖子放入数据库中 3.之后向socketio发送事件来处理正在运行的nodejs服务器,将其推送到用户B的频道,并告诉用户B用户A已发布内容 4.如果成功,则通知用户A他的帖子成功
请注意,我不涉及redis在上述流程中,有任何反馈吗?
2个回答

5
使用套接字来实现这个功能是一种相当复杂的方法。虽然这是可能的,但你真正需要做的就是在页面上添加一个定时的POST请求(客户端),以检查新评论。
那时你所需要的一切都在数据库中。发件人、收件人、日期和消息。
使用套接字,你必须为每个拥有“墙”的用户设置一个通道,而任何查看某人“墙”的人都必须订阅它,如果有很多人,当你需要扩展时就会出现问题。这意味着需要使用sockets.io和redis。
尽管这样做很“酷”,但在我看来,这是过度设计了。

我在stackoverflow上还太新了,无法编辑我的答案,所以提醒一下...保持简单。 - Chris
但你真正需要做的就是从该页面添加一个定时的帖子请求(客户端),以检查新评论。你的意思是使用ajax请求,例如:每10秒钟向服务器请求以检查新评论/通知等?是的,我也是这样想的,直到我发现了socket,我仍在考虑其优缺点。 - mohur
实际上,如果我理解得很清楚的话,对于通知/简单消息系统,最好使用定时的Ajax请求,对吗?在相对中等流量的网站上会有问题吗?我的意思是,基于这个事实,我将至少有5000个在线用户,这意味着如果我将定时的Ajax设置为5秒,那么每5秒钟我就会收到5000个请求(假设定时请求同时开始),而且未来还会有更多的用户。如果与通道进行比较,那么将会有5000个通道,但我不知道(因为我从未使用过套接字)5000个通道或每5秒钟5000个请求哪个更好。 - mohur
关于套接字和通道,抱歉,我用错了术语。每个用户将使用自己的房间,并且您可以通过套接字即时设置它。无论哪种方式,对于成千上万的用户,保持每个用户的套接字打开,或者处理成千上万的小型POST请求。如果您扩展(服务器数量或甚至使用集群),则套接字将需要使用redis,而使用POST请求意味着只需添加一个新服务器或集群,没有任何麻烦。 - Chris
嗯,你说得对,我想我会选择使用Ajax请求,可能设置10-30秒的超时时间。在阅读更多关于套接字文章后,我认为当双向连接很重要且延迟较低(例如:聊天系统)时,最好使用套接字。由于客户端只请求通知并推送简单消息,因此我将使用Ajax。感谢您的建议,先生:D。无论如何,赏金还需要20个小时才能发放。 - mohur
显示剩余4条评论

0
  1. 构建一个微服务,使用缓存系统和数据仓库技术来建立套接字连接,在数据库层面上使用触发器,当数据进行增删改时。

  2. 使用 Parse 数据库服务器,它具有订阅实时查询的酷炫功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接