已知 Twitter 2020 年大约有 2000 亿的推文(tweets),如果你来设计 Twitter 系统,请问发推服务的吞吐量需要多少,网络带宽要占用多大,要存储它们需要多少磁盘容量?
具体不同的编码方式,占用大小不一样的。比如你说的UTF8的话,英文字符是占用一个字节,如果是中文是三个字节;而Unicode编码的话则是两个字节。
对于系统估算类问题,最重要的是过程要符合逻辑,而估算的最后结果并不是最重要的。过程正确的话,结果的数量级基本上是八九不离十的,那么设计出的系统往往就是靠谱的。
从职位来看,如果职位需要比较强的架构设计能力,或者团队是做软件中的基础设施部分的,那往往就需要候选人具备靠谱且快速的估算能力。
吞吐量,一般可以估算 TPS(Transaction Per Second),2000 亿 / 365 天 / 24 小时/ 60 分 / 60 秒,大概是 6000 左右,那么考虑 TPS 的波动性,我们简单预留 3 倍的空间,认为系统的 TPS 需要预留到 20000 左右,就大致可行了。网络带宽,我们假设平均每条推文 200 个字符,众所周知每个字符占用 2 个字节(B,Byte),每个字节为 8 个比特(b,bit),我们在这里统一使用 Byte,而不是 bit(这里说明一下,你的网络运营商为了数据好看,可能会用比特每秒,而不是字节每秒宣传
它的带宽)。这样每条推文就占用了 200 * 2 = 400 Byte,因此带宽就是 400 Byte *20000 吞吐量 = 8 MB 的带宽。这里其实从 B 到 MB 应该使用 1/1024 的倍率,但是估算就使用了近似的 1/1000 的倍率。存储,2000 亿推文 * 200 个字符 * 2 Byte = 80 TB 一年
图片
假设条件:
- 预计用户数:100万
- 日活跃用户比例:10%
- 平均每用户每天上传图片数量:5张
- 平均每张图片大小:2MB
- 图片访问频率:每张图片每天被访问10次
- 数据冗余:3份数据副本
- 年增长率:20%
容量计算:
-
存储容量计算:
- 每日新图片存储需求 = 用户数 * 日活跃用户比例 * 平均每用户每天上传图片数量 * 平均每张图片大小
- 每日新图片存储需求 = 1,000,000 * 0.1 * 5 * 2MB = 10,000,000MB 或 10TB
-
总存储需求:
- 考虑到数据冗余,总存储需求 = 每日新图片存储需求 * 数据冗余
- 总存储需求 = 10TB * 3 = 30TB
-
年度存储增长:
- 预计第一年结束时的总存储需求 = 总存储需求 * (1 + 年增长率)
- 预计第一年结束时的总存储需求 = 30TB * (1 + 0.2) = 36TB
-
带宽需求计算:
- 每日图片访问带宽需求 = 用户数 * 日活跃用户比例 * 平均每张图片大小 * 图片访问频率
- 每日图片访问带宽需求 = 1,000,000 * 0.1 * 2MB * 10 = 200TB 或 200TB
-
处理能力估算:
- 根据图片处理需求,估算所需的CPU和内存资源。这通常需要根据具体的图片处理算法和硬件性能来确定。
-
数据库容量:
- 存储元数据(如图片ID、用户ID、上传时间等)的数据库大小也需要估算。这通常取决于数据库的设计和索引策略。
-
备份存储需求:
- 根据备份策略(如每日增量备份和每周全备份),估算备份存储需求。
-
扩展性考虑:
- 考虑到用户和数据的增长,系统设计需要具备良好的扩展性,以便在资源不足时快速扩展。
video
“码率5Mbps”表示每秒传输的数据量为5兆位(megabits),通常用于描述视频或音频的传输速率。在视频和音频编解码过程中,码率决定了每秒钟传输的数据量,从而影响了图像或声音的质量和清晰度。因此,5Mbps的视频码率意味着每秒钟会以5Mbps的速度传输视频数据。
问题描述
假设你需要设计一个视频存储和流媒体系统,该系统用于存储用户上传的视频,并支持流媒体播放。系统需要满足以下要求:
- 支持 500 万(5,000,000)用户。
- 每个用户平均上传 50 部视频。
- 每部视频平均时长为 10 分钟。
- 视频分辨率为 1080p,平均码率为 5 Mbps(兆位每秒)。
你需要估算系统总共需要的存储容量,并考虑存储冗余(RAID 6)和备份策略(每日备份,保留最近 7 天的备份)。
计算过程
1. 总视频数
首先计算总视频数:
[ \text{总视频数} = \text{用户数} \times \text{每用户视频数} ]
[ \text{总视频数} = 5,000,000 \times 50 = 250,000,000 \text{(2.5亿部视频)} ]
2. 原始存储需求
计算每部视频的大小:
[ \text{每部视频大小} = \text{视频时长(秒)} \times \text{码率} ]
[ \text{每部视频大小} = 10 \text{分钟} \times 60 \text{秒/分钟} \times 5 \text{Mbps} = 3,000 \text{Mb} = 375 \text{MB} ]
计算总视频存储需求:
[ \text{原始存储需求} = \text{总视频数} \times \text{每部视频大小} ]
[ \text{原始存储需求} = 250,000,000 \times 375 \text{MB} = 93,750,000,000 \text{MB} = 93,750,000 \text{GB} = 93,750 \text{TB} ]
3. 存储冗余(RAID 6)
RAID 6 需要至少 4 个磁盘,其中两个磁盘用于冗余数据,存储效率为 ( n-2/n )(其中 n 是磁盘数量)。
假设使用 6 个磁盘:
[ \text{RAID 6 存储需求} = \frac{\text{原始存储需求}}{(n-2)/n} ]
[ \text{RAID 6 存储需求} = \frac{93,750 \text{TB}}{(6-2)/6} = \frac{93,750 \text{TB}}{0.6667} \approx 140,625 \text{TB} ]
4. 备份需求
需要每日备份,并保留最近 7 天的备份:
[ \text{备份存储需求} = \text{RAID 6 存储需求} \times 7 ]
[ \text{备份存储需求} = 140,625 \text{TB} \times 7 = 984,375 \text{TB} ]
5. 总存储需求
计算总存储需求(主存储 + 备份):
[ \text{总存储需求} = \text{RAID 6 存储需求} + \text{备份存储需求} ]
[ \text{总存储需求} = 140,625 \text{TB} + 984,375 \text{TB} = 1,125,000 \text{TB} ]
总结
系统总共需要的存储容量约为 1,125,000 TB,以满足 500 万用户,每用户 50 部视频,每部视频 10 分钟,1080p 分辨率、5 Mbps 码率的存储需求,并考虑 RAID 6 冗余和每日备份保留 7 天。