"Back-of-the-envelope estimation",直译是信封背面估算的意思,"Back-of-the-envelope estimation"是一个短语,用于描述使用简化的假设和基本原理进行的粗略或快速计算,通常在信封背面或任何可用的纸上进行。它是一种在不进行详细分析或复杂计算的情况下进行粗略估计或近似的方法。 信封背面估算的目的是提供一个大致数字或对概念的规模或可行性有个大致的了解,而无需投入大量时间或资源进行精确计算。它可用于评估一个想法的可行性,评估决策的潜在影响,或快速比较不同选项。 虽然信封背面估算可能缺乏详细分析的精确性,但它们对于快速决策、启动进一步调查或以简明易懂的方式传达思想是有价值的。
在系统设计面试中,你有时会被要求使用信封背面估算来评估系统容量或性能需求。根据谷歌高级研究员杰夫·迪恩的说法,“信封背面的计算是你利用思想实验和常见性能数字组合创建的估算,以便对哪些设计将满足你的需求有一个好的理解”[1]。
你需要有对可扩展性基础的良好理解,以有效地进行信封背面估算。以下概念应该得到充分理解:二的力量[2],每个程序员应该知道的延迟数字,以及可用性数字。
AI不会取代你,使用AI的人会。欢迎关注我的公众号:更AI。以程序员的视角来看AI能带给我们什么~
虽然在处理分布式系统时,数据量可能会变得非常大,但所有的计算都归结为基本的计算。为了得到正确的计算结果,知道以二的幂来表示的数据量单位至关重要。一个字节是8个比特的序列。一个ASCII字符使用一个字节的内存(8比特)。下面是一个解释数据量单位的表格(表2-1)。
谷歌的迪恩博士揭示了2010年典型计算机操作的长度[1]。随着计算机变得更快、更强大,一些数字已经过时。然而,这些数字仍然应该能够让我们对不同计算机操作的快慢有个大致的了解。
注释
ns = 纳秒,μs = 微秒,ms = 毫秒 1 ns = 10^-9 秒 1 μs= 10^-6 秒 = 1,000 ns 1 ms = 10^-3 秒 = 1,000 μs = 1,000,000 ns
一位谷歌软件工程师建立了一个工具来可视化迪恩博士的数字。这个工具也将时间因素考虑在内。图2-1显示了截至2020年的可视化延迟数字(图源:参考材料[3])。
通过分析图2-1中的数字,我们得到以下结论:内存速度快,但磁盘速度慢。尽可能避免磁盘寻址。简单的压缩算法速度快。如果可能,压缩数据后再通过互联网发送。数据中心通常位于不同地区,发送数据之间需要时间。
高可用性是一个系统能够连续运行一个期望的长时间段的能力。高可用性以百分比衡量,其中100%表示服务没有停机时间。大多数服务的可用性在99%到100%之间。
服务级别协议(SLA)是服务提供商常用的术语。这是你(作为服务提供商)与你的客户之间的协议,这个协议正式定义了你的服务将提供的运行时间水平。云服务提供商Amazon [4],Google [5]和Microsoft [6]将他们的SLA设定在99.9%或以上。运行时间传统上以九为单位衡量。九的数量越多,表现越好。如表2-3所示,九的数量与预期的系统停机时间相关。
请注意,以下数字仅用于此练习,因为它们并非来自Twitter的真实数字。
假设:有3亿月活跃用户。50%的用户每天使用Twitter。用户平均每天发布2条推文。10%的推文包含媒体内容。数据存储5年。
估算:
每秒查询数(QPS)估算:每日活跃用户(DAU)= 300 million * 50% = 1.5亿推文QPS = 1.5亿 * 2 条推文 / 24小时 / 3600秒 = ~3500峰值QPS = 2 * QPS = ~7000
我们只在这里估算媒体存储。平均推文大小:tweet_id 64字节文本 140字节媒体 1 MB媒体存储:1.5亿 * 2 * 10% * 1 MB = 每天30 TB5年媒体存储:30 TB * 365 * 5 = ~55 PB
信封背面的估算完全是关于过程的。解决问题比获得结果更重要。面试官可能会测试你的问题解决能力。这里有一些可以遵循的提示:取整和近似。在面试过程中进行复杂的数学运算是困难的。例如,“99987 / 9.1”的结果是什么?没必要花宝贵的时间去解决复杂的数学问题。不需要精确。利用取整和近似。这个除法问题可以简化为:“100,000 / 10”。写下你的假设。写下你的假设以便稍后参考是个好主意。标记你的单位。当你写下“5”时,是指5 KB还是5 MB?你可能会因此混淆自己。写下单位,因为“5 MB”有助于消除模糊性。常被问到的信封背面估算:QPS、峰值QPS、存储、缓存、服务器数量等。在为面试做准备时,你可以练习这些计算。熟能生巧。
恭喜你已经到了这一步!现在给自己一个赞扬。干得好!
AI不会取代你,使用AI的人会。欢迎关注我的公众号:更AI。以程序员的视角来看AI能带给我们什么~
[1] J. Dean. Google Pro Tip: 使用信封背面计算法选择最佳设计:
http://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope- calculations-to-choo.html
[2] 系统设计入门: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/
发表评论