二、信封背面估计
在系统设计面试中,有时你会被要求使用粗略估计来估计系统容量或性能需求。根据谷歌高级研究员 Jeff Dean 的说法,“信封背面的计算是你使用思维实验和常见性能数字的组合来创建的估计,以获得满足你要求的设计的良好感觉”[1]。
您需要对可伸缩性基础有一个很好的认识,以便有效地进行预估。应该很好地理解以下概念:2 的幂,每个程序员都应该知道的延迟数字,以及可用性数字。
二的幂
虽然在处理分布式系统时,数据量会变得巨大,但计算都归结为基础。为了获得正确的计算结果,使用 2 的幂知道数据量单位是非常重要的。一个字节是 8 位的序列。一个 ASCII 字符使用一个字节的内存(8 位)。下表解释了数据量单位(表 2-1)。
每个程序员都应该知道的延迟数字
来自谷歌的迪恩博士揭示了 2010 年典型计算机操作的长度[1]。随着计算机变得更快更强大,一些数字已经过时了。然而,这些数字应该仍然能够让我们了解不同计算机操作的快慢。
注释
-
ns =纳秒,s =微秒,ms =毫秒
1 纳秒= 10^-9 秒
1 秒= 10^-6 秒= 1000 纳秒
1 毫秒= 10^-3 秒= 1000 秒= 1000000 纳秒
一名谷歌软件工程师开发了一个工具来可视化迪安博士的数据。该工具还考虑了时间因素。图 2-1 显示了截至 2020 年的可视化延迟数字(图片来源:参考资料[3])。
通过分析图 2-1 中的数字,我们得到以下结论:
内存快但磁盘慢。
尽可能避免磁盘寻道。
简单压缩算法速度快。
如果可能的话,在通过互联网发送数据之前对其进行压缩。
数据中心通常在不同的区域,它们之间发送数据需要时间。
可用性数字
高可用性是指系统在期望的长时间内持续运行的能力。高可用性以百分比来衡量,100%意味着服务没有停机时间。大多数服务介于 99%和 100%之间。
服务水平协议(SLA)是服务提供商常用的术语。这是您(服务提供商)和您的客户之间的协议,该协议正式定义了您的服务将提供的正常运行时间水平。云提供商亚马逊[4]、谷歌[5]和微软[6]将其 SLA 设定为 99.9%或以上。正常运行时间传统上是以 9 来衡量的。九越多越好。如表 2-3 所示,9 的数量与预期的系统停机时间相关。
示例:估计 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 字节
媒体 1 MB
媒体存储:每天 1.5 亿* 2 * 10% * 1mb = 30tb
5 年介质存储:30 TB * 365 * 5 = ~55 PB
提示
信封背面的评估是关于整个过程的。解决问题比获得结果更重要。面试官可能会测试你解决问题的能力。以下是一些可以遵循的提示:
舍入和近似。面试时很难进行复杂的数学运算。比如“99987 / 9.1”是什么结果?没必要花宝贵的时间去解复杂的数学题。不期望精度。使用对你有利的整数和近似值。除法问题可以简化为:“10 万/ 10”。
写下你的假设。写下你的假设供以后参考是个好主意。
给你的单位贴上标签。你写下“5”,是指 5 KB 还是 5 MB?你可能会对此感到困惑。写下单位,因为“5 MB”有助于消除歧义。
常见的粗略估计:QPS、峰值 QPS、存储、缓存、服务器数量等。准备面试的时候可以练习一下这些计算。熟能生巧。
祝贺你走到这一步!现在给自己一个鼓励。干得好!
参考资料
【1】j .迪恩。Google Pro 提示:使用信封背面的计算来选择最佳设计:
[3]每个程序员都应该知道的延迟数字:
https://Colin-Scott . github . io/personal _ website/research/interactive _ latency . htmlT3】
【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/