系统设计题

System design questions

我正在准备系统设计面试,由于我对这个主题的经验很少,所以我从 [=59= 购买了“Grokking the system design interview”课程],被多个网站推荐。 但是我读了它,我想我没有设法理解一些东西,所以如果有人能回答我的问题,那将是有帮助的。

  1. 由于我没有使用过nosql,所以很难选择合适的数据库系统。有几次课程只是不给出任何理由为什么它选择一个数据库而不是另一个数据库。例如,在“设计 Youtube 或 Netflix”一章中,编辑选择了 mysql 作为 db 角色,但没有任何解释。在同一章中,我们有以下非功能性需求:

"The system should be highly available. Consistency can take a hit (in the interest of availability); if a user doesn’t see a video for a while, it should be fine."

按照上面的提示并考虑到系统的大小并在 "CAP theorem" 章节中应用 material 对我来说似乎或者 Cassandra 和 CouchDB 将是一个更好的选择。我在这里想念什么?

同样的问题适用于“设计 Facebook 的新闻源

  1. CAP 定理是否仍然适用?

我的意思是:根据章节"CAP theorem",HBase在一致性和分区容错性方面表现良好,但根据HBase文档,它从版本2.X开始也支持High Availibility。所以在我看来,它是一个适合所有人/通用的数据库存储解决方案,它违反了 CAP 定理,除非他们为 HA 牺牲了一些东西。我在这里想念什么?

  1. 课程中有关计算机可以处理多少 RAM/storage/bandwidth 的数字有点不一致,我想它们已经过时了。 a,普通计算机,b,现代服务器的当前数字是多少?

  2. 几乎每一章都有一个叫做"Capacity Estimation and Constraints"的部分,但是这里计算的内容因章节而异。有时只计算存储,通常也会计算带宽,有时会添加 QPS,有时还有特定于任务的指标。 我怎么知道我应该为特定任务计算什么?

提前致谢!

每个数据库都是不同的,满足不同的要求。我建议您阅读 dynamo-paper,并熟悉其中使用的其余术语(两阶段锁定、leader/follower、多领导者、async/sync 复制、仲裁),并了解什么保证不同的数据库提供。现在开始提问:

  1. MySQL 可以配置为以其异步复制模型的一致性为代价来优先考虑可用性(领导者在提交写入之前不等待其追随者的确认;如果一个leader 在数据传播给 followers 之前崩溃,数据丢失),所以它可以是这里合适的解决方案之一。

  2. HBase的文档来看,HBase保证了强一致性,即使是以牺牲可用性为代价的。 高可用性的承诺是为了读取,而不是为了写入,即读取陈旧数据,同时系统的其余部分从故障中恢复并可以接受额外的写入。

    because of this single homing of the reads to a single location, if the server becomes unavailable, the regions of the table that were hosted in the region server become unavailable for some time.

    Since all writes still have to go through the primary region, the writes are not highly-available (meaning they might block for some time if the region becomes unavailable).

  3. 使用的数字是候选人的估计,即您决定单个假设服务器的规格是什么,以及您需要多少台服务器才能扩展和容纳 storage/throughput要求.

  4. 你事先不知道(虽然你可以根据需求进行猜测,例如如果是数据存储系统,流媒体服务等,我仍然不推荐) .相反,你应该问面试官他们感兴趣的领域是什么,然后你就可以做出估计。面试,尤其是系统设计部分,是讨论,不要照搬模板。您认识到您可以解决系统的不同领域,并根据面试官的兴趣来处理它们。