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 如何通知并立即显示新评论,或者 *** 是如何做到的?的主要内容,如果未能解决你的问题,请参考以下文章