在设计社交网络时(推特,fb新闻提要等)“推”与“拉”

use*_*636 5 architecture system

在社交网络上设计Feed / twitter系统时,我们都知道推(写入时扇出)与拉(读取时扇出)。

在推送模式下,每当作者生成新帖子时,我们都会写入该作者的朋友(或关注者)的更新(帖子,推文等)列表,这样他们的关注者就无需查询其所有关注者的每次喂。

在拉动模式下,我们让追随者每次需要查看其所有好友的供稿时,都会查询其所有流动的好友的供稿。

但是在这两种情况下,通常使用什么机制使人们可以在网站上实时查看更新的提要?(我认为FB或twitter不需要您手动刷新页面以查看朋友的新帖子)。

假设John撰写了一个帖子,并且在推送模式下,它将该帖子的指针推送(写入SQL或Redis缓存)到他所有朋友的feed中,他的一个朋友的浏览器如何知道约翰现在有更新?

Ara*_*ery 7

我假设您有一个动态 (SPA) 前端。

在拉模式下,您有两种选择:

  • 定期重新获取提要数据,每次发送上次查询时间以仅过滤新的提要项目。这种方法在开始新项目时效果很好,但无法很好地扩展。

  • 拥有一个消息代理,在创建新帖子后,您需要向所有可能更新提要的在线客户端发布事件,稍后在收到此类事件后在客户端重新加载提要。您还可以在事件负载本身中包含新内容。

在推送模式下:

  • 定期重新获取提要数据(由于提要查询并不复杂,因此性能开销要少得多)。

  • 当您要推送时,请检查客户端是否有活动连接并同时发布事件。

通常人们使用混合方法:

  • 对于拥有大量活跃消费者(上个月至少登录一次)的生产者,请使用拉取方法。

  • 对于活跃消费者数量较少的生产者,请使用推送方法。

在推送方法中,用户提要中项目数量的容量非常重要。如果用户请求更多提要项目,您可以退回到仅拉动。此外,由于有容量,您不需要推送给不活跃的用户(可能会在他们登录之前被新的提要项目替换)。


小智 5

这是系统设计面试中的常见问题。通常要求申请 FAANG 或类似公司的后端软件工程师。

\n

我从 Facebook 的论文中了解到为什么他们更喜欢在 TAO Graph 数据库中使用 Pull(读时扇出)模型,该模型用于提供帖子、点赞等的时间线。

\n
\n

单个 Facebook 页面可以聚合并过滤社交图谱中的数百个项目。\n我们向每个用户提供针对他们\n量身定制的内容,并通过考虑当前查看者\n的隐私检查来过滤每个项目。

\n

这种极端的定制使得在创建内容时可以执行大多数聚合和过滤;相反,我们会解决数据依赖性并在每次查看内容时检查隐私。我们尽可能拉动社交图谱,而不是推送它。

\n

这种实现策略对图形数据存储提出了极高的读取要求;\n它必须高效、高度可用,并且可以扩展到高查询率。

\n
\n

\xe2\x80\x93 2013 年论文,TAO:Facebook\xe2\x80\x99s 社交图谱分布式数据存储

\n

Twitter \xe2\x80\x93 中使用了另一种方法 Push 方法。\n我还没有调查 Twitter 使用它来预填充个人推文时间线的任何来源。

\n

  • 你可能有一个答案,因为 Facebook 实际上更喜欢根据引用“拉”。 (2认同)