第2章:粗略估算
简介
在系统设计面试中,粗略估算是一项至关重要的技能。它通过快速、粗略的计算来评估系统的容量或性能。据谷歌资深研究员杰夫·迪恩所言,这类估算有助于借助思想实验和常见的性能基准,判断设计方案是否能够满足需求。
本章涵盖构建可扩展性和估算能力所需的关键概念、方法论及示例。
第1节:关键概念
Power of Two
从2的幂次方来理解数据量是基础:

这些知识有助于进行准确的存储与带宽计算。
Latency Numbers Every Programmer Should Know
延迟数值反映了计算系统中各项操作所耗费的时间。这些数据有助于洞察相对性能:
#IRAtuTsyoyUA text { white-space: pre; }#IRAtuTsyoyUA .fb0 { stroke: var(--N900-FG, 0.15); }#IRAtuTsyoyUA .fb0 {stroke: rgba(31,35,41, 0.15)}#IRAtuTsyoyUA .fx0 { stroke-miterlimit: 10; }#IRAtuTsyoyUA .fx0 {stroke-miterlimit: 10}#IRAtuTsyoyUA .fa1 { fill: rgb(187, 191, 196); }#IRAtuTsyoyUA .fa1 {fill: rgb(187, 191, 196)}#IRAtuTsyoyUA .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#IRAtuTsyoyUA .fx1 {font-style: normal}#IRAtuTsyoyUA .fx2 { text-anchor: middle; }#IRAtuTsyoyUA .fx2 {text-anchor: middle}#IRAtuTsyoyUA .fx3 { dominant-baseline: central; }#IRAtuTsyoyUA .fx3 {dominant-baseline: central}#IRAtuTsyoyUA .fx4 { stroke: none; }#IRAtuTsyoyUA .fx4 {stroke: none}#IRAtuTsyoyUA .fc0 { fill: var(--text-caption); }#IRAtuTsyoyUA .fc0 {fill: #646a73}#IRAtuTsyoyUA .fa2 { fill: var(--text-link-disabled); }#IRAtuTsyoyUA .fa2 {fill: rgb(187, 191, 196)}#IRAtuTsyoyUA .fa3 { fill: rgb(225, 234, 255); }#IRAtuTsyoyUA .fa3 {fill: rgb(225, 234, 255)}#IRAtuTsyoyUA .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#IRAtuTsyoyUA .fx5 {font-style: normal}#IRAtuTsyoyUA .fx6 { text-anchor: start; }#IRAtuTsyoyUA .fx6 {text-anchor: start}#IRAtuTsyoyUA .fx7 { dominant-baseline: alphabetic; }#IRAtuTsyoyUA .fx7 {dominant-baseline: alphabetic}#IRAtuTsyoyUA .fc1 { fill: rgb(0, 0, 0); }#IRAtuTsyoyUA .fc1 {fill: rgb(0, 0, 0)}#IRAtuTsyoyUA .fb1 { fill: var(--N900-FG, 0.15); }#IRAtuTsyoyUA .fb1 {fill: rgba(31,35,41, 0.15)}#IRAtuTsyoyUA .fb2 { fill: rgb(209, 217, 224); }#IRAtuTsyoyUA .fb2 {fill: rgb(209, 217, 224)}#IRAtuTsyoyUA .fa4 { fill: var(--bg-body); }#IRAtuTsyoyUA .fa4 {fill: #fff}AB12345678操作L1缓存访问L2缓存访问主内存访问SSD随机读取HDD随机寻道数据中心往返时间跨区域数据中心延迟(2020年)0.5纳秒7纳秒100纳秒150微秒10毫秒500微秒150毫秒
关键洞察:
•
内存速度快,磁盘速度慢。
•
尽可能避免磁盘寻道。
•
在通过互联网传输数据前进行压缩,以节省带宽。
Availability Numbers
高可用性(HA)确保停机时间尽可能短。可用性通常用九个9:
•
99%(两个9):每年约3.65天的停机时间
•
99.9%(三个九):每年约8.8小时的停机时间
•
99.99%(四个九):每年约52分钟的停机时间
•
99.999%(五个九):每年约5.3分钟的停机时间
•
99.9999%(六九):每年约31.56秒的停机时间
亚马逊、谷歌、微软等云服务商的目标服务等级协议(SLA)为99.9%或更高.
第2节:示例估算——Twitter的QPS与存储需求
Assumptions
•
月活跃用户数(MAU):3亿。
•
日活跃用户数(DAU):50%。
•
人均每日发帖数: 2.
•
10%的推文包含媒体。
•
数据保留:5年。
Estimations
每秒查询量(QPS):
◦
DAU = ( 300M x 50% = 150M )
◦
Tweets QPS = ( 150M x 2 tweets / 24 hour / 3600 seconds = ~3500 )
◦
峰值QPS = ( 2 x 3500 = 约7000 )
媒体存储:
◦
Tweet大小构成:
▪
tweet_id: 64 bytes
第3节:有效估算的技巧
Rounding and Approximation
精度并非关键;应聚焦于流程。可采用四舍五入的近似值简化复杂计算。例如:
•
( 99987 / 9.1 ) 可近似为 ( 100,000 / 10 = 10,000 )。
Write Down Assumptions
请清晰记录各项假设,以备日后参考。
Label Units
这是一个名为“system-design-notes/01. Scaling at main · liquidslr/system-design-notes”的GitHub仓库页面。上下文。
Common Estimation Scenarios
•
QPS(每秒查询数):衡量流量强度。
•
峰值QPS:考虑流量高峰。
•
存储需求:估算总数据量需求。
•
缓存需求:评估缓存所需的内存容量。
•
服务器数量:根据工作负载计算硬件需求。