新闻、帮助、产品更新动态

最新的业界新闻,产品系统更新开发动态,帮助教程和活动发布

系统设计:Facebook的新闻流设计

发布日:2022-01-10 14:44       阅读数:

需求
让我们设计Facebook的新闻提要,其中包含来自Facebook的帖子、照片、视频和状态更新
 
用户关注的所有人和页面。类似服务:Twitter新闻源、Instagram新闻源、Quora新闻提要
 
难度等级:难
 
1.Facebook的新闻源是什么?
新闻订阅是脸谱网主页中间不断更新的故事列表。它包括状态更新、照片、视频、链接、应用程序活动以及来自用户访问的人员、页面和组的“喜好”。关注Facebook。换句话说,它是一个完整的可滚动版本的来自照片、视频、位置、状态更新和其他活动的朋友和你的生活故事
 
对于你设计的任何社交媒体网站——Twitter、Instagram或Facebook——你都需要一些新闻提要系统显示来自朋友和追随者的更新。
 
2.系统的要求和目标
让我们根据以下要求为Facebook设计一个新闻提要:
 
功能要求:
 
1.新闻提要将基于用户访问的人员、页面和组的帖子生成跟随。
 
2.一个用户可能有很多朋友,并且关注大量页面/组。
 
3.提要可能包含图像、视频或文本。
 
4.我们的服务应支持在所有活动的新闻提要中添加新帖子用户。
 
非功能性要求:
 
1.我们的系统应该能够实时生成任何用户的新闻提要-看到的最大延迟最终用户将是2s。
 
2.假设有一个新的新闻源请求,一篇文章不应该花费超过5秒的时间进入用户的提要进来。
 
3.容量估算和限制条件
让我们假设一个用户平均有300个朋友,关注200个页面。
 
流量估计:
 
假设每天有3亿活跃用户,每个用户都会获取他们的时间线。平均每天五次。这将导致每天15亿个新闻提要请求,约17500个每秒请求数。
 
存储估计:
 
平均而言,假设每个用户的提要中需要大约500篇文章,我们想保留在内存中以便快速获取。我们还假设平均每个帖子大小为1KB。这意味着我们需要为每个用户存储大约500KB的数据。储存所有这些所有活动用户的数据我们需要150 TB的内存。如果一台服务器可以容纳100GB,我们会需要大约1500台机器为所有活跃用户保留内存中的前500篇文章。
 
4.系统API
� 一旦我们确定了需求,定义系统API明确说明系统的期望值。我们可以使用SOAP或RESTAPI来公开服务的功能。以下可能是
 
获取新闻源的API的定义:
 
getUserFeed(api_dev_key, user_id, since_id, count, max_id, exclude_replies)
 
参数:
 
api_dev_key(string):注册用户的api开发者密钥可用于,根据分配的配额限制用户。
 
user_id(number):系统将为其生成新闻提要的用户的id。
 
since_id (number)::可选;返回ID高于(即,比)的结果指定ID。
 
count (number):可选;指定要尝试和检索的提要项的数量,最多为每个不同的请求200个。
 
max_id (number):可选;返回ID小于(即早于)或等于指定ID。
 
exclude_replies(boolean)::可选;此参数将阻止回复出现在返回的页面中时间线。
 
Returns: (JSON))返回包含提要项列表的JSON对象
 
5.数据库设计
有三个主要对象:用户、实体(如页面、组等)和提要(或帖子)。这是关于这些实体之间关系的一些观察结果:
 
•用户可以跟随其他实体并与其他用户成为朋友。
 
•用户和实体都可以发布包含文本、图像或视频的提要。
 
•每个FeedItem都有一个用户ID,该ID将指向创建它的用户。为了简单起见,让我们假设只有用户可以创建提要项目,尽管Facebook页面上可以发布提要我也是。
 
•每个FeedItem可以选择性地具有一个EntityID,该ID指向其所在的页面或组,该职位已创建。
 
如果我们使用的是关系数据库,我们需要建模两种关系:用户-实体关系和用户-实体关系饲料媒体关系。由于每个用户都可以与许多人成为朋友,并关注许多实体,我们可以将此关系存储在单独的表中。“UserFollow”中的“Type”列标识正在跟踪的实体是用户或实体。类似地,我们可以有一个FeedMedia关系表

6.高层系统设计
 
从高层次上讲,该问题可分为两部分:
 
提要生成:新闻提要是从用户和实体(页面和页面)的帖子(或提要项)生成的用户遵循的组。因此,每当我们的系统收到为用户生成提要的请求时(说Jane),我们将执行以下步骤:
 
1.检索Jane跟踪的所有用户和实体的ID。
 
2.检索这些ID的最新、最流行和相关帖子。这些都是潜在的职位,我们可以在Jane的新闻提要中显示。
 
3.根据与Jane的相关性对这些职位进行排名。这表示Jane当前的提要。
 
4.将此提要存储在缓存中,并返回要在Jane提要上呈现的顶级帖子(比如20篇)。
 
5.在前端,当Jane完成当前提要时,她可以获取接下来的20个帖子,从服务器等。
 
这里需要注意的一点是,我们生成了一次提要并将其存储在缓存中。新的呢从Jane关注的人那里收到的帖子?如果Jane在线,我们应该有一个排名机制并将这些新帖子添加到她的提要中。我们可以定期(比如每五分钟)执行上述操作,对新帖子进行排名并将其添加到提要中的步骤。然后,可以通知Jane中有更新的项目。
 
提要发布:
 
每当Jane加载她的新闻提要页面时,她都必须请求并从中提取提要项服务器。当她到达当前提要的末尾时,她可以从服务器中提取更多数据。对于更新的项目服务器可以通知Jane,然后她可以提取,或者服务器可以推送这些新项目帖子。我们稍后将详细讨论这些选项。
 
在较高级别上,我们的新闻提要服务需要以下组件:
 
1.Web服务器:维护与用户的连接。此连接将用于传输数据用户和服务器之间的数据。
 
2.应用服务器:执行在数据库服务器中存储新帖子的工作流。我们还需要一些应用服务器来检索新闻提要并将其推送到最终用户。
 
3.元数据数据库和缓存:存储用户、页面和组的元数据。
 
4.帖子数据库和缓存:存储帖子及其内容的元数据。
 
5.视频和照片存储,以及缓存:Blob存储,用于存储帖子中包含的所有媒体。
 
6.新闻源生成服务:收集并排列所有相关帖子,供用户生成新闻源和存储在缓存中。此服务还将接收实时更新,并将添加这些更新
 
向任何用户的时间线提供更新的项目。
 
7.提要通知服务:通知用户有更新的项目可供其使用新闻提要。
 
下面是我们系统的高层架构图。用户B和C正在跟踪用户A。

编辑:航网科技   来源:腾讯云

本文版权归原作者所有 转载请注明出处

联系我们

客服部:深圳市龙华区龙胜商业大厦5楼B5区

业务部:深圳市南山区讯美科技广场2栋12楼1202

资质证书

  • Copyright © 2011-2020 www.hangw.com. All Rights Reserved 深圳航网科技有限公司 版权所有 增值电信业务经营许可证:粤B2-20201122 - 粤ICP备14085080号

    在线客服

    微信扫一扫咨询客服


    全国免费服务热线
    0755-36300002

    返回顶部