第 2 章:粗略判断
在系统设计面试中,有时候你会被要求使用一种粗略估算的方法来估计系统容量或性能要求。根据Google高级研究员Jeff Dean的说法,“粗略估算是你使用思维、实验和常见性能数据的组合来估计哪些设计方案能够满足你的需求的估算”[1]。
要有效地进行粗略估算,你需要对可伸缩性基础知识有很好的了解。以下概念应该被充分理解:2的幂次方[2]、每个程序员都应该了解的延迟数据以及可用性数据。
2的幂次
尽管在处理分布式大规模系统时数据量可能会变得庞大,但所有计算都归结为基本数学。为了获得正确的计算结果,了解数据量单位并使用2的幂次方是至关重要的。一个字节是8位。一个ASCII字符占用一个字节的内存(8位)。下面是解释数据量单位的表格(表2-1)。

延迟数
谷歌的Dean博士在2010年公布了典型计算机操作的时间长度[1]。随着计算机变得更快更强大,一些数据已经过时。然而,这些数据仍然能够让我们了解不同计算机操作的快慢。

一个谷歌软件工程师开发了一个工具来可视化Dean博士的数据。该工具还考虑了时间因素。图2-1展示了截至2020年的可视化延迟数据[3]。

通过分析图表2-1中的数据,我们可以得出以下结论:
内存速度快,而磁盘速度慢。
如果可能的话,要避免进行磁盘寻址。
简单的压缩算法速度较快。
如果可能的话,在将数据发送到互联网上之前进行数据压缩。
数据中心通常位于不同的地区,发送数据之间需要一定的时间。
可用性数据
高可用性是系统在一个理想的长时间内保持持续运行的能力。高可用性以百分比表示,其中100%表示一个没有停机时间的服务。大多数服务的可用性介于99%和100%之间。 服务水平协议(SLA)是服务提供商常用的术语。这是您(服务提供商)与客户之间的协议,它正式定义了您的服务将提供的可用时间水平。云服务提供商Amazon [4]、Google [5]和Microsoft [6]将其SLA设定在99.9%或更高。可用时间传统上以“九”的数量来衡量。九的数量越多,可用性就越好。如表2-3所示,九的数量与预期的系统不可用时间相关联。

示例:估算Twitter的QPS和存储需求
请注意,以下数字仅用于此练习,因为它们不是来自Twitter的真实数字。
假设:
月活跃用户为3亿。
50%的用户每天使用Twitter。
用户平均每天发2条推文。
10%的推文包含媒体内容。
数据存储5年。
估算:
每秒查询(QPS):
每日活跃用户(DAU)= 3亿 * 50% = 1.5亿
推文QPS = 1.5亿 * 2条推文 / 24小时 / 3600秒 = ~3500
峰值QPS = 2 * QPS = ~7000
这里我们只估算媒体存储。
平均推文大小:
推文ID 64字节
文本 140字节
媒体 1MB
媒体存储:1.5亿 * 2 * 10% * 1MB = 每天30TB
5年的存储:30TB * 365 * 5 = ~55PB
翻译:建议 简易估算的重点是过程。解决问题比获得结果更为重要。面试官可能会测试你的问题解决能力。以下是一些建议:
• 四舍五入和近似。面试过程中很难进行复杂的数学运算。例如,“99987 / 9.1”的结果是多少?没有必要浪费宝贵的时间解决复杂的数学问题。不期望你得到完全精确的答案。利用整数和近似进行估算。以上面的除法问题为例,可以简化为:“100,000 / 10”。
• 记录你的假设。写下你的假设,以便后续参考。
• 标明单位。当你写下“5”时,它是指5KB还是5MB?可能会因此而困惑。记下单位,因为“5MB”有助于消除歧义。
• 常被问到的简易估算问题:QPS、峰值QPS、存储、缓存、服务器数量等。为面试做准备时,你可以练习这些计算。熟能生巧。
恭喜你走到这一步!现在给自己一个鼓励。做得好!
参考资料
[1] J. J. Dean.Google Pro Tip: Use Back-Of-The-Envelope-Calculations To Choose The Best Design: https://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope-calculations-to-choo.html
[2] System design primer: https://github.com/donnemartin/system-design-primer
[3] 程序员应该了解的延迟数据: https://colin-scott.github.io/personal_website/research/interactive_latency.html
[4] 亚马逊计算服务水平协议: https://aws.amazon.com/compute/sla/
[5] 计算引擎服务水平协议(SLA): https://cloud.google.com/compute/sla
[6] Azure服务的SLA摘要: https://azure.microsoft.com/en-us/support/legal/sla/summary/
Last updated