在系统设计中,可能会面临封底估算(Back-of-the-Envelope Estimation)的场景,这要求你通过合理的估算来评估系统的能力或性能需求。根据谷歌高级研究员Jeff Dean的观点,封底估算是通过将想象中的实验与常见性能指标数据结合,得出初步概念,以便了解何种设计可以满足系统需求。
为了有效地进行封底估算,你需要掌握可扩展性的基础知识,并且应该深入理解以下概念:2的幂、程序员应该了解的操作耗时,以及与可用性相关的数据。这些知识将帮助你在系统设计中更好地评估系统设计的可行性和性能要求。
在处理分布式系统时,尽管数据量可能变得非常庞大,但相关的计算本质上仍然是基本的数学运算。为了确保获得正确的计算结果,对于2的幂所代表的数据量单位有深刻的了解非常重要。在计算机科学中,数据存储的基本单位是字节(byte),而位(bit)则是字节的基本构成单元。一个字节等于8位(bit)也叫比特。
具体而言,一个ASCII字符通常占用1字节的内存,相当于8比特。这意味着,一个ASCII字符可以由8个二进制位表示。理解字节和位的关系对于有效地处理数据以及在分布式系统中执行正确的计算是至关重要的。在处理大规模数据时,2的幂的概念也经常用于确定适当的数据存储和处理容量。例如,存储容量经常以2的幂的形式表示,如2^10(1024字节)或 2^20(1兆字节)等。
1. 操作耗时
在2010年,谷歌的高级研究员Jeff Dean在他的文章中分享了典型计算机操作所需的时间。尽管随着计算机速度的提升和算力的增强,其中一些数据可能已经过时,但这些数字仍然为我们提供了对不同操作耗时的了解。这些数据虽然可能需要根据现代硬件和技术的发展进行更新,但仍然是一个有用的参考,帮助我们理解计算机操作的相对耗时。
以上数据我们可以得出结论:
- 内存的速度相对较快,而硬盘的速度相对较慢。
- 尽量避免在硬盘中进行数据查找,以提高数据访问效率。
- 使用简单的压缩算法可以加速数据的处理速度。
- 在通过因特网传输数据之前,最好在尽可能的程度上对数据进行压缩。
- 数据中心通常分布在不同的地理区域,因此在它们之间传输数据可能需要较长的时间。
2. 可用性相关的数字
高可用性指的是系统能够长时间持续运行的能力。通常,高可用性使用百分比进行衡量,其中100%表示服务没有不可用的时间。大多数服务的可用性介于99%到100%之间。
SLA(服务水平协议)是服务提供商广泛使用的术语,它是服务提供商和客户之间的正式协议,明确规定了提供的服务应该正常运行的时间。云服务提供商,如亚马逊、谷歌和微软,通常将它们的SLA设定为99.9%或更高。正常运行时间通常以小数点后的“9”的个数来度量,而“9”的数量越多,代表可用性越高。下图详细列出了“9”的数量与系统预计不可用时长之间的关系。
例子:我们尝试估算下推特的QPS和存储需求
以下为练习数据,非真实数据。假设条件:
- 推特有3亿用户
- 50%的用户每天都使用推特
- 用户平均每天发两条推文
- 10%的推文包含多媒体数据
- 数据要存储5年
根据上述条件估算QPS(每秒查询量),多媒体数据的存储量是多少?
1. 估算QPS
每日活跃数DAU = 300_000_000✖️50% = 150_000_000
推文QPS = 150_000_000✖️2 ➗ 24(小时) ➗3600(秒) ≈ 3500
峰值QPS(每秒查询量) = 推文QPS✖️2 =7000
2.多媒体数据存储量
平均推文大小:
推文ID = 64KB
推文 = 140KB
多媒体文件 = 1MB
每天多媒体文件存储量 = 150_000_000✖️2✖️1MB = 300_000_000MB ≈ 30000GB = 30TB
5年需要存储量 = 30TB✖️365✖️5 ≈ 55000TB = 55PB
这里问题的解决点不在于数据计算,而是在于你的估算逻辑。