系统设计:分片计数器


介绍分片计数器。

问题陈述

像Facebook、Twitter和YouTube这样的实时应用程序具有高用户流量。用户与应用程序进行交互,并根据应用程序的结构执行多个操作(查看、点赞、评论等)。例如,在一个Facebook页面上发布了一张图片,该页面有数百万的粉丝,每毫秒后该帖子的点赞数量迅速增加。在这种情况下,对于这个单个图像进行点赞可能很容易,但是当许多名人同时上传数千个这样的图像或视频,每个名人都有数百万的粉丝时,我们该怎么办?这个问题被称为“重要性高的问题”。

上述情况显示了一个简单的计数操作如何变得难以精确和高效地管理。下图显示了在2021年8月的24小时内由数百万用户观看的YouTube视频:

QQ截图20230410155710

平均每秒有六千条推文在Twitter上发送,这相当于每分钟360,000条推文和每天约5亿条推文。处理这些5亿条推文上的数十亿个赞是一项具有挑战性的任务。以下表格显示了截至2022年一天中最受欢迎的推文:

QQ截图20230410155922

我们如何处理数百万的写请求来处理每分钟的数千条推文上的点赞?问题在于写入需要比读取更多的时间,并且并发活动使这个问题更加困难。随着某个计数器(可能是一个驻留在节点内存中的变量)的并发写入数量增加,锁争用将呈非线性增长。在某一点之后,我们可能会花费大部分时间获取锁,以便我们可以安全地更新计数器。

我们将如何设计分片计数器?

我们将把分片计数器的设计分为三个课程:

  1. 高级设计:在本课程中,我们将讨论分片计数器的高级设计。此外,我们还将简要解释API设计。

  2. 详细设计:本课程将深入探讨分片计数器的设计。此外,我们还将评估我们提出的设计。

  3. 测验:我们将通过测验回顾分片计数器设计的主要概念。

让我们从分片计数器的高级解决方案草图开始。