Facebook 如何通知并立即显示新评论,或者 *** 是如何做到的?

Posted

技术标签:

【中文标题】Facebook 如何通知并立即显示新评论,或者 *** 是如何做到的?【英文标题】:How does Facebook notify and instantly shows new comments or how does *** do it? 【发布时间】:2013-01-14 03:12:29 【问题描述】:

我是一名 php 开发人员,标题基本上说明了一切。然而,我希望获得更深入的信息,因为我开始对我所从事的项目的流程应该如何进行感到困惑。

对于(网络)应用程序,我需要实现像 Facebook 这样的功能,即通知用户有关回复/cmets 并立即显示这些内容。

我想我可以对 ajax 请求使用长轮询,但这似乎不是一个好的解决方案,因为通知从来都不是即时的,而且资源繁重。

所以如果我理解正确的话,我应该使用某种形式的套接字,Node.Js 将是一个不错的选择。因此,基于最后一个假设,我现在对工作流程感到困惑。

我想到了两种可能的解决方案:

1) 在我看来,如果我使用 Node.Js,我可以完全跳过使用 PHP,而仅将应用程序基于 Node.js。

2) 或者我可以使用 PHP 作为基础,只使用 Node.js 来通知用户并立即显示消息,但使用 PHP 和 mysql 保存数据。

这两种可能性让我感到困惑,我无法决定什么是“最好的”和最干净的方式。

我对 Node.js 没有太多经验,玩了一段时间。但是在 Node.js 中管理和保存数据似乎很困难,所以这就是我提出选项 2 的原因。

我知道 Facebook 是基于 PHP 构建的,所以我假设他们通过 PHP 保存数据并通过 Node 通知/立即显示回复和 cmets。

有人可以帮我解决这个问题吗?

提前致谢!

编辑: 我刚刚注意到,*** 做了类似的事情。我在左上角收到一条通知,在我的问题下方有一个带有“此问题的新答案”的框。我对所使用的技术非常感兴趣。

【问题讨论】:

也许您可以为 *** 用于通知系统的技术创建一个新问题,或者更好地在这里搜索更多内容:) 【参考方案1】:

您可以将 node.js 用于通知,将 PHP 用于您的应用程序。 通过谷歌搜索,我发现了这个关于 real-time-notifications 的信息。 您也可以只使用node.js with socket.io,但这意味着您必须学习新技术,因为您提到您没有使用节点的经验。

我没用过,但你可以查看this project,了解 PHP 中的 websockets。

当您有想要通知用户的更新时,您可以使用发布subscriber pattern 来通知对此更新感兴趣的人。 也可以查看Gearman。

就我个人而言,我使用pubsub mechanism of redis 和node.js+socket.io 构建了一个通知系统。每当记录有更新时,就会在相应的频道上发布。如果频道有听众,那么他们会收到通知。我还将最后 20 条通知存储在 Redis 列表中。

该应用程序是用 PHP 构建的。通知系统内置在 node.js 中。它们是看到相同数据的不同应用程序。通信通过 redis 进行。例如在 Facebook 上下文中: 1) 用户更新他的状态。 2) PHP 将其存储到数据库和 Redis 3) Redis 知道此更新必须发布到特定用户的状态通道,并且确实如此。 4)特定用户的所有朋友都在收听他的状态频道(这里是node.js) 5)Node.js用socket.io在浏览器中推送通知

至于 facebook,我读过一篇文章,它使用长轮询来支持旧版浏览器。不过不确定,需要引用...

【讨论】:

对于你构建的“pusub 机制”,除了node,你有没有使用其他语言?我对 PHP 中的 websockets 有点怀疑,因为我相信 PHP 本身并不打算以这种方式使用。 这正是我所需要的!而且我认为这对我来说也是最合适的选择,因为我知道 PHP 并且通知部分不会那么难。感谢您的广泛解释和信息。 在我最初的问题之后,我现在玩节点,因为我似乎理解节点在它自己的端口上运行,所以如果我去例如 myserver.com:3737 节点运行,但我有 PHP在 myserver.com(端口 80)上运行。但是如何让我的 PHP 应用程序与 Node 通信呢?可能需要创建一个新问题,但我希望答案非常简单.. 看看 [haproxy haproxy.1wt.eu/] 和 acls。很快,您可以做的是使用 node.js 和其他使用 php 为您的应用程序提供特定请求。我也认为这应该是一个新问题。 不,我想你弄错了。您提到的“工具”实际上是存储。 PHP 将数据存储在 Redis 中(也可以是另一个),node.js 可以访问这些数据。在这种情况下,使用 Redis 作为存储的好处是您可以对节点侦听器说:“嘿,我有一些您可能感兴趣的数据”。节点知道并且可以“透明地”获取它们。【参考方案2】:

AFAIK 这将通过两种简单的方法:

    第一个可能非常简单的方法是向每条记录添加一个布尔列,以确定它是否已收到通知。

    第二种方法是创建一个表格来插入所有通知。

但是,我不确定是否有其他方法可以提高性能,但第一种方法是我自己通常做的。但我认为 Facebook 使用的是第二种方法,因为它必须将每个人通知给很多用户。

您的问题可能重复:Facebook like notifications tracking (DB Design)Database design to store notifications to users

【讨论】:

我已经检查了多个线程,是的,但我觉得我需要更多信息。因为我不是在质疑通知/数据库设计的跟踪,而是更多地关注应用程序的流程。【参考方案3】:

您可以使用Server Side Events,它涉及一些 javascript,但我认为没有什么过于复杂。

尽管这种方法的主要部分是 PHP,所以您只需使用 PHP 来查询您的数据库以获取通知,SSE 会将它们推送给用户。

但它确实有一些限制,最值得注意的是它不受 IE 支持(非常惊讶)我想我还是会提到它让你知道其他可能性。

希望对你有帮助

【讨论】:

以上是关于Facebook 如何通知并立即显示新评论,或者 *** 是如何做到的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中创建通知系统?

如何在您的 iOS 应用收到新评分或评论时收到通知

在 Swift 中在后台检查服务器端应用程序通知

如何创建像 Facebook 一样的标题提醒效果?

使用 codeigniter 的 Facebook 评论

MySql vs NoSql - 社交网络评论和通知数据结构和实现