系统设计面试题 之 如何设计Instagram

本文翻译自https://www.educative.io/collection/page/5668639101419520/5649050225344512/5673385510043648

1.什么是Instagram

Instagram是一个社交网络服务,用户可以在这个网站上上传和分享他们的照片和视频。Instagram的用户能设置他们的分享内容为所有人可见或者部分人可见。向所有人分享的照片或视频可以被任何用户查看,但是向部分人分享的内容仅仅能被部分人查看。Instagram也能够让它的用户们通过其他社交媒体比如Facebook,Twitter,Flickr和Tumblr分享内容。

2.系统的需求和设计目标

在本题中,我们将主要解决以下问题:
功能性需求:
1.用户能够上传/下载/查看照片;
2.用户能够基于标题搜索照片/视频;
3.用户能够关注其他用户;
4.这个系统能够为用户生成和显示“推送新闻(News Feed)”,“推送新闻(News Feed)”由该用户关注的所有用户的最新照片/视频组成。
非功能性需求:
1.该系统的服务应该是高可用的;
2.对于“推送新闻(News Feed)”,系统可接受的延迟是200毫秒;
3.本系统对一致性的要求略低;如果用户暂时没看到其他用户更新的内容,也是可以接受的;
4.本系统应该高度可靠,并且任何上传的照片/视频永远不能丢失。
本文不讨论的问题:为图片添加标签,根据标签搜索照片,注释照片,推荐关注的用户,建议反馈,等等。

3.一些设计考虑

本系统是一个read-heavy的系统,所以我们的设计重点是确保该系统能够快速的获取照片。
1.因为用户能上传大量的照片,所以对存储的有效管理是设计该系统的关键点;
2.用户查看照片的延时应该满足设计要求;
3.数据应该100%可靠。如果用户上传了一张照片,那么系统应该保证该照片永远不丢失。

4.存储容量预估

假设我们有5亿用户,每天有1百万活跃用户;
每天都会有2百万新照片上传,也就是每秒有23张新照片上传;
假设平均的照片文件大小为200KB;
每天上传的照片占用的空间为 2000000 * 200KB = 400 GB
10年需要的空间为:400GB * 365 (days a year) * 10 (years) ~= 1425TB

5.系统整体设计

我们需要考虑两个使用场景,一是上传照片;二是查看/搜索照片。我们的服务需要使用面向对象存储服务器来保存照片,还需要一些数据库服务器存储照片的元数据。

6.数据库schema

在面试中尽早定义数据库schema能帮助你更好的理解不同组件间的数据流,并且能为后面的数据分区提供指导。
“User”表用来保存用户相关的数据、用户上传的照片和用户关注的其他用户。“Photo”表用来保存与照片相关的所有数据;我们要为PhotoID和 CreationDate创建索引,因为

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值