如何设计 Twitter(第一部分)

原文:How to Design Twitter (Part 1)

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

从上周的调查来看,我们的大部分用户都希望更多地了解系统设计面试。

没有任何示例就很难提供提示,这就是为什么在这篇文章中,我将使用一个非常流行的系统设计问题,告诉你如何解决它。

另外值得一提的是,系统设计面试问题可以是非常开放的,因此没有标准答案这样的事情。 即使是同一个问题,你也会和不同的面试官进行完全不同的讨论。

因此,不要过分关注问题或解决方案本身。 相反,你最好从分析中总结出某些模式或策略

我们将从这个“简单”问题开始 - 你将如何设计 Twitter?

注:我从来没有在 Twitter 工作,整篇文章是为了说明系统设计的想法。 另外,感谢 Gainlo 团队在我们一起合作提供所有这些分析。

常见的误解

在我们进行分析之前,我想澄清求职者的最常见的误解之一。

当被要求设计推特时,许多人倾向于立即潜入技术细节。一个常见的行为是列出一些像 MongoDB,Bootstrap,MapReduce 等工具或框架,并试图解释我们应该使用哪种特定的技术。

面试官真正需要的是如何解决问题的概要想法。使用什么工具并不重要,但是如何定义问题,如何设计解决方案以及如何逐步分析问题是非常重要的。

这些正是初级开发人员和高级工程师的区别。如果你还没有查看这个文章,你也应该看看。

定义问题

让我们开始讨论这个问题 - 如何设计 Twitter。

系统设计问题通常是非常普遍的,因此没有很好的定义。这就是很多人不知道如何开始的原因。

这与现实生活中的项目很相似。因此,我们要做的第一件事就是进一步明确问题,使问题更加明确和具体。

在这个问题上,我首先要做的就是将 Twitter 压缩到 MVP(最小可行产品)。换句话说,我们只会设计 Twitter 的核心,而不是一切功能。

所以整个产品应该允许人们相互关注,并查看他人的信息流(Feeds)。就是这样简单。 (如果需要任何功能,面试官应该能够澄清)。其它功能例如注册,Moment,安全等都不在讨论范围之内。

概要解决方案

我们之前说过,不要立即深入所有的细节,这也会把面试官和你自己搞晕。

我在这里使用的通用策略是,将整个系统分成几个核心组件。 有相当多的分支策略,例如,你可以分为前端/后端,离线/在线逻辑等。

在这个问题中,我将为以下两件事情设计解决方案:1)数据建模。 2)如何处理信息流。

数据建模 - 如果我们想使用像 MySQL 这样的关系数据库,我们可以定义用户对象和信息流对象。 两种关系也是必要的。 一个是用户可以关注其它用户,另一个是每个信息流都由一个用户拥有。

处理信息流 - 最直接的方法是从所有关注的人中提取信息流,并按时间呈现它们。

面试将不会在这里停止,因为还有很多我们还没有涉及的细节。 面试官完全可以决定接下来要讨论的内容。

具体问题

要记住,概要想法可以无限延伸。所以我只会在这里介绍一些后续问题。

  1. 当用户关注​​很多人时,获取并呈现所有的推文可能开销很大。如何改善它?

    有很多方法。由于 Twitter 拥有无限滚动功能,特别是在移动设备上,每次我们只需要获取最新的 N 个推文,而不是所有的推文。然后会有很多如何实现分页的细节。

    你也可以考虑缓存,这也可能有助于加快速度。

  2. 如何检测假用户?

    这可能与机器学习有关。其中一种方法是确定注册日期,粉丝数量,推文数量等相关特征,并构建一个机器学习系统来检测用户是否是假的。

  3. 我们可以用其他算法来订阅信息流嘛?

    过去几周这个话题的争论很多。如果我们想根据用户的兴趣订购,如何设计算法?

    我想说一些我们应该向面试官澄清的事情。

    如何衡量算法?也许用户在推特或用户交互上喜欢/转发的平均时间。

    用什么信号来评估用户喜欢这个信息流的可能性?用户与作者的关系,该信息的回复/转发数量,作者的粉丝数量等可能重要。

    如果使用机器学习,如何设计整个系统?

  4. 如何实现 @ 功能和转推功能?

    对于 @ 功能,我们可以简单存储每个推文的用户 ID 列表。因此,在呈现你的信息流时,你还应该包含 @ 列表中拥有你的 ID 的信息流。这稍微增加了呈现逻辑的复杂性。

    对于转推功能,我们可以做类似的事情。在每个推文中,都会存储一个推文 ID(指针),如果存在,则会指示原始推文。

    但要小心,当用户转推已转推的推文时,你应该能够弄清楚正确的逻辑。这是一个产品决策,你是否要将其制作成多层还是仅保留原始推文。

总结

在这个话题中,我想介绍的东西太多了,所以我不得不把它分成两部分。

这里值得澄清的是,对于我提到的每个问题,没有标准解决方案。 换句话说,还有很多其他解决方案同等或优于上述方案。

另外,这个问题已经被简化了很多,我非常肯定在 Twitter 的生产中已经开发了更多的东西。

在这里再次强调,解决方案不是你应该最关心的。 相反,尝试了解我如何处理和分析问题。

如果你觉得这篇文章有帮助,请分享给你的朋友,我会很感谢。 你也可以在这里查看更多的系统设计面试问题和分析。