0098 系统设计——Instagram设计
设计Instagram
让我们设计一个像Instagram这样的照片共享服务,用户可以在其中上传照片以与其他用户共享。类似服务:Flickr,Picasa难度级别:中
1.什么是Instagram?#
为了进行此练习,我们计划设计一个更简单的Instagram版本,一个用户可以共享照片,也可以关注其他用户。每个用户的“新闻提要”将由该用户关注的所有人的顶照组成。
2.系统的要求和目标#
- 我们的服务需要高度可用。
- 对于新闻提要生成,系统可接受的延迟时间为200毫秒。
- 如果用户有一段时间没有看到照片,一致性可能会受到影响(为了可用性)。应该没问题
- 该系统应高度可靠;任何上传的照片或视频都不会丢失。
**不在范围内:**在照片中添加标签,在标签中搜索照片,在照片中添加评论,在照片中为用户添加标签,关注对象等。
3.一些设计考虑#
该系统将是繁重的读取工作,因此我们将集中精力构建一个可以快速检索照片的系统。
4.容量估算和约束#
400GB * 365(每年的天数)* 10(年)〜= 1425TB
5.高级系统设计#
从高层次上讲,我们需要支持两种方案,一种方案是上传照片,另一种方案是查看/搜索照片。我们的服务将需要一些对象存储服务器来存储照片,还需要一些数据库服务器来存储有关照片的元数据信息。
6.数据库架构编号
存储上述模式的一种直接方法是使用像MySQL这样的RDBMS,因为我们需要连接。但是关系数据库面临着挑战,尤其是当我们需要扩展它们时。有关详细信息,请看一下SQL vs. NoSQL。
通常,Cassandra或键值存储区始终维护一定数量的副本以提供可靠性。另外,在此类数据存储中,删除不会立即应用,数据会保留几天(以支持取消删除),然后才能从系统中永久删除。
7.数据大小估计#
让我们估计每张表中将要存储多少数据,以及十年后我们将需要多少存储空间。
**用户:**假设每个“ int”和“ dateTime”为四个字节,则用户表中的每一行将为68个字节:
用户ID(4个字节)+名称(20个字节)+电子邮件(32个字节)+ DateOfBirth(4个字节)+ CreationDate(4个字节)+ LastLogin(4个字节)= 68个字节
如果每天上传200万张新照片,则一天将需要0.5GB的存储空间:
UserFollow: UserFollow表中的每一行将由8个字节组成。如果我们有5亿用户,并且平均每个用户关注500个用户。UserFollow表需要1.82TB的存储空间:
32GB + 1.88TB + 1.82TB〜= 3.7TB
8.组件设计#
照片上载(或写入)可能会很慢,因为它们必须进入磁盘,而读取会更快(尤其是从缓存中获取照片时)。
9.可靠性和冗余#
丢失文件不是我们服务的一种选择。因此,我们将存储每个文件的多个副本,以便如果一个存储服务器死了,我们可以从另一台存储服务器上存在的另一副本中检索照片。
同样的原理也适用于系统的其他组件。如果要使系统具有较高的可用性,则需要在系统中运行多个服务副本,以便在少数服务中断时,系统仍保持可用并正在运行。冗余消除了系统中的单点故障。
如果在任何时候只需要运行一个服务的实例,我们就可以运行该服务的冗余辅助副本,该副本不提供任何流量,但是当主节点出现问题时,它可以在故障转移之后获得控制权。
10.数据分片#
因此,我们将通过UserID%10查找分片号,然后将数据存储在那里。为了唯一地标识我们系统中的任何照片,我们可以在每个PhotoID后面添加分片号。
**我们如何生成PhotoID?**每个数据库分片都可以具有自己的PhotoID自动递增序列,并且由于我们将ShardID与每个PhotoID附加在一起,因此它将在整个系统中变得唯一。
- 我们将如何处理热门用户?有好几个人关注这些热门用户,还有很多其他人看到他们上传的任何照片。
- 与其他用户相比,某些用户将拥有很多照片,因此存储分配不均匀。
- 如果我们无法将用户的所有图片存储在一个分片上怎么办?如果我们将用户的照片分发到多个分片上,会导致更高的延迟吗?
- 将用户的所有照片存储在一个分片上可能会引起问题,例如,如果该分片掉线,则该用户的所有数据均不可用;如果该分片服务于高负载,则可能导致更高的延迟等。
**生成密钥的数据库不是单点故障吗?**是的,会的。一种解决方法是定义两个这样的数据库,其中一个生成偶数编号的ID,另一个生成奇数编号的。对于MySQL,以下脚本可以定义此类序列:
KeyGeneratingServer1:
auto-increment-increment = 2
auto-increment-offset = 1KeyGeneratingServer2:
auto-increment-increment = 2
auto-increment-offset = 2
**或者,**我们可以实现类似于在设计URL缩短服务(如TinyURL)中讨论的“密钥”生成方案。
11.排名和新闻提要生成#
要为任何给定的用户创建新闻提要,我们需要获取该用户关注的人的最新,最受欢迎和相关的照片。
每当这些服务器需要生成用户的新闻提要时,它们将首先查询UserNewsFeed表以查找上一次为该用户生成新闻提要的时间。然后,从该时间起将生成新的新闻提要数据(遵循上述步骤)。
有关生成News Feed的详细讨论,请参阅Designing Facebook’s Newsfeed。
12.使用分片数据创建新闻提要#
PhotoID的大小可能是多少?假设我们的时代开始于今天,那么接下来的50年我们需要多少位来存储秒数?
86400秒/天* 365(一年中的天)* 50(年)=> 16亿秒
我们将需要31位存储该数字。由于平均而言,我们期望每秒23张新照片;我们可以分配9位来存储自动递增的序列。因此,我们每秒可以存储(2 ^ 9 => 512)张新照片。我们可以每秒重置一次自动递增序列。
我们将在“ 设计Twitter ”中的“数据分片”下讨论有关此技术的更多详细信息。
13.缓存和负载平衡#
我们的服务将需要大规模的照片传送系统来服务于全球分布的用户。我们的服务应该使用大量按地理位置分布的照片缓存服务器并使用CDN将其内容推近用户,有关详细信息,请参阅Caching。
0098 系统设计——Instagram设计相关推荐
- 微型计算机温度控制系统课程设计,微机原理及其应用 微型计算机温度控制系统设计课程设计报告.doc...
微机原理及其应用 微型计算机温度控制系统设计课程设计报告 <微机原理及其应用>课程设计报告 2011年3月2日 课程设计题目及系统功能介绍 微型计算机温度控制系统设计,假设工业现场温度范围 ...
- 用c语言设计交通咨询系统,交通咨询系统设计课程设计.doc
交通咨询系统设计课程设计 课 程 设 计 报 告 课程名称 数据结构 课题名称 交通咨询系统 专 业 班 级 学 号 姓 名 指导教师 2013 年 月 日 设计内容与设计要求 1设计内容 [问题描述 ...
- 微型计算机温度控制系统设计,微机原理及其应用微型计算机温度控制系统设计课程设计报告;...
<微机原理及其应用微型计算机温度控制系统设计课程设计报告;>由会员分享,可在线阅读,更多相关<微机原理及其应用微型计算机温度控制系统设计课程设计报告;(20页珍藏版)>请在人人 ...
- 关于抢红包的_抢红包系统设计与设计
历经半个多月的时间,Debug呕心沥血.亲自录制的"缓存中间件Redis技术入门与应用场景实战(SpringBoot2.x + 抢红包系统设计与实战)"的新课终于完成了,顾名思义, ...
- 计费系统设计_Web设计人员的按小时计费与基于价值的定价
计费系统设计 If you are a web designer/developer who currently bills per hour, I hope I can persuade you t ...
- SSO单点登录系统设计,数据库设计文档
SSO 系统设计文档 1 .SSO 数据库设计 1.1 SSO用户表 ssoUsers 字段名 中文名称 字段类型 说明 ssoUserId 序号 Int(4) PK,自增 ssoLoginId SS ...
- 系统设计 架构设计 画图工具 架构图 设计图
为什么要进行详细的系统设计? 系统由小慢慢迭代增加的过程中, 由于换了很多产品/开发, 每个人的想法不同, 迭代时间紧等原因, 导致系统修修补补越来越难维护, 这里的维护包括修复bug和开发新功能 程 ...
- 系统设计——如何设计一个高性能的短链接系统?
短链系统设计看起来很简单,但如何设计一个高性能短链系统呢,这也是面试中非常常见的一道设计题. 首先,为什么要用短链? 短链跳转的基本原理是什么? 短链生成的几种方法你知道吗? 高性能短链的架构如何设计 ...
- 200T四柱式液压机结构及控制系统设计(设计说明书+CAD 液压机+液压站+油箱+主缸+主缸缸筒+液压系统原理图+液压机电气控制系统+梯形图)
摘 要 本次毕业设计的主要任务为200T三梁四柱式液压机的结构设计及控制系统设计.液压机的应用较广泛,在日常生活中到处可以见到,其基本工作原理为根据帕斯卡原理.以液体作为传递介质,达到实现能量的转换 ...
最新文章
- 语义分割:基于openCV和深度学习(一)
- java编程 linux_Linux下java编程
- 02.Python网络爬虫第二弹《http和https协议》
- “service httpd does not support chkconfig” 問題
- [导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性
- C++基础之继承类和派生类
- 如何卸载干净32位的Office
- CSS hack:区分IE6 IE7 Firefox
- LeetCode 138 复制带随机指针的链表-中等
- C语言库函数大全及应用实例四
- NEO从源码分析看共识协议
- sigprocmask, sigpending, sigsuspend的用法
- 为什么要写this在访问成员变量的时候_java面向对象(局部变量和成员属性)
- Java中提取字符串中的数字
- 数据分析的步骤和常用方法
- spring源码构建时缺失spring-cglib-repack和spring-objenesis-repack的正确处理姿势
- 多个域名泛域名证书和多域名证书
- MCS-51单片机C语言程序注释,精通MCS-51单片机C语言编程
- 北京通信展的精华,都在这里!(上)
- 整理出几款Gitee 上优秀的后台开源版本的管理系统,简直是接私活利器