如何处理高读取、(非常)高写入数据库?

问题描述 投票:0回答:1

我最近浏览了一些系统设计视频,偶然发现了 youtube 系统设计。视频中提到的一些规格让我想知道 YouTube 如何处理其平台上的所有评论。 “评论”表中每天肯定有数十亿条条目。

  1. 所有这些都存储在一个表中吗?包含数万亿条目的表是否可以维护?

  2. 如何获取特定视频的评论?考虑到要查看的数据,延迟不应该非常高吗?

  3. 如果有一些基于video_id的索引,索引是否可以维护?

  4. 10 年前的视频可以有 10 年前的评论以及 1 天前的评论。那么,分区在这里有什么作用吗?

  5. 另一个重要的事情是评论线程。这些是如何维护的?

我尝试用谷歌搜索这些内容,但找不到任何相关内容。任何帮助将不胜感激。

youtube youtube-api system-design
1个回答
0
投票

首先,我建议查看 https://github.com/donnemartin/system-design-primer 作为系统设计的良好起点。

对于您的特定问题,没有单一的正确答案,但这是一种方法:

  1. 所有这些都存储在一个表中吗?包含数万亿条目的表是否可以维护?

表是一个逻辑结构。在引擎盖下,引擎将完成所有必需的复制和分区。因此,即使从应用程序的角度来看它是单个表,数据本身也是分布式的。

  1. 如何获取特定视频的评论?考虑到要查看的数据,延迟不应该非常高吗?

系统倾向于以不同的方式对待较受欢迎和较不受欢迎的资源。对于不太受欢迎的,可以有更高的延迟,这是一个合理的权衡。对于更流行的资源,广泛使用两种方法:a)缓存和 b)将相关数据相邻存储(例如,将全部或部分评论存储在单个逻辑记录中以进行单次读取)。

这些数据系统通常是 NoSQL,这意味着它们针对特定用例进行了设计优化。请在此处查看此类设计的教程:https://cassandra.apache.org/doc/latest/cassandra/data_modeling/index.html我建议阅读整个部分,注意 sql 和 nosql 之间的不同方法。

  1. 如果有一些基于video_id的索引,该索引是否可以维护?

索引可以被视为任何其他数据,例如正在分发。

  1. 10 年前的视频可以有 10 年前的评论以及 1 天前的评论。那么,分区在这里有什么作用吗?

如上所述,评论可以存储为单个实体,也可以在读取和缓存操作中捆绑在一起。很大程度上取决于实施和权衡的细节。

  1. 另一个重要的事情是评论线程。这些是如何维护的?

我会将顶级评论保留在单个数据结构中(数据库中的同一记录)以便于检索。我会单独保留每个线程并按需阅读。

© www.soinside.com 2019 - 2024. All rights reserved.