在本章中,您将被要求设计一个新闻提要系统。什幺是新闻提要?根据Facebook 帮助页面,“News feed 是中间不断更新的故事列表。您的主页。动态消息包括状态更新、照片、视频、链接、应用活动记录和喜欢您在 Facebook 上关注的人、页面和群组“[1]。这是一个流行的面试问题。类似的常见问题有:设计Facebook新闻提要,Instagram 提要、Twitter 时间线等
第一组澄清问题是了解面试官的想法当她要求你设计一个新闻提要系统时。至少,你应该弄清楚支持哪些功能。以下是应聘者与面试官互动的例子:
应聘者:这是移动应用进程吗?还是 Web 应用进程?还是两者兼而有之?
面试官:Both
应聘者:有哪些重要功能?
面试官:用户可以在动态消息页面上发布帖子并查看其朋友的帖子。
应聘者:新闻提要是按时间倒序排序还是按任何特定顺序排序比如题目分数?例如,来自密友的帖子得分更高。
面试官:为了简单起见,让我们假设提要是按时间倒序排序的订单。
应聘者:一个用户可以有多少个好友?
面试官:5000
应聘者:流量是多少?
面试官:1000万DAU
应聘者:Feed 可以包含图片、视频还是仅包含文本?
面试官:它可以包含媒体文档,包括图像和视频。现在您已经收集了需求,我们专注于设计系统。
该设计分为两个流程:Feed 发布和新闻 Feed 构建。
新闻源 API
新闻源 API 是客户端与服务器通信的主要方式。那些API 基于 HTTP,允许客户端执行操作,包括发布状态检索新闻提要、添加好友等。我们将讨论两个最重要的 API:feed发布 API 和新闻提要检索 API。
Feed 发布 API
要发布帖子,HTTP POST 请求将发送到服务器。API如下图所示:
POST /v1/me/feed
参数:
新闻源检索 API
检索新闻提要的 API 如下所示:
获取 /v1/me/feed
参数:
Feed 发布
图 11-2 显示了源发布流程的高级设计。
新闻源大楼
在本节中,我们将讨论如何在幕后构建新闻提要。图 11-3 显示了高级设计:
高级设计简要介绍了两个流程:源发布和新闻源生成。在这里,我们将更深入地讨论这些主题。
Feed 发布深入探讨
图 11-4 概述了源发布的详细设计。我们已经讨论了大部分组件,我们将重点介绍两个组件:Web 服务器和扇出服务。
网站服务器
除了与客户端通信之外,Web 服务器还强制执行身份验证和速率限制。只有使用有效 auth_token 登录的用户才可以发帖。系统限制了用户在一定时间内可以发布的帖子数量,对于防止垃圾邮件和滥用行为至关重要内容。
扇出服务
扇出是将帖子发送给所有朋友的过程。两种类型的扇出模型是:写入时的扇出(也称为推模型)和读取时的扇出(也称为拉模型)。两个都模型各有利弊。我们解释他们的工作流程并探索最佳方法支持我们的系统。
写入时扇出。通过这种方法,新闻源是在写入时预先计算的。一个新的帖子发布后会立即发送到朋友的缓存中。
优点:
我们采用混合方法来获得这两种方法的优点并避免其中的陷阱。由于快速获取新闻源至关重要,因此我们对大多数用户使用推送模型。对于名人或拥有很多朋友/关注者的用户,我们让关注者拉取新闻内容按需以避免系统过载。一致性哈希是一种有用的技术,可以减轻热键问题,因为它有助于更??均匀地分配请求/数据。让我们仔细看看如图11-5所示的扇出服务
扇出服务的工作原理如下:
缓存体系结构
缓存对于新闻提要系统极为重要。我们将缓存层分为 5 层如图11-8所示
在本章中,我们设计了一个新闻提要系统。我们的设计包含两个流程:feed发布和新闻提要检索。像任何系统设计面试问题一样,没有完美的系统设计方法。每公司有其独特的约束条件,您必须设计一个系统来适应这些约束条件。了解设计和技术选择的权衡非常重要。如果有剩下的几分钟,您可以谈谈可伸缩性问题。为避免重复讨论,仅下面列出了高级别的谈话要点。
扩展数据库:
其他谈话要点:
恭喜你走到这一步!现在拍拍自己的背。干得好!
参考资料
[1] 动态消息的工作原理:
https://www.facebook.com/help/327131014036297/
[2] 朋友的朋友推荐 Neo4j 和 SQL 服务器:
http://geekswithblogs.net/brendonpage/archive/2015/10/26/friend-of-friendrecommendations-with-neo4j.aspx