如何设计 Twitter(第二部分)

原文:How to Design Twitter (Part 2)

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

这篇文章谈论了系统设计面试的问题,特别是如何设计 twitter 。如果你还没有查看第一部分,请去阅读。

好的,这里是系统设计面试问题 - 如何设计 twitter 的第二部分。上一篇文章中我们已经提到,我们知道系统设计问题可能是非常开放的。即使是同一个问题,你肯定会和不同的面试官有完全不同的讨论。

Gainlo 团队提供了分析,我相当确定有更好的方法。

Twitter 已经是一个拥有大量功能的庞大产品。在这篇文章中,我们将讨论如何从系统设计面试角度设计 Twitter 的特定功能。

热门话题

Twitter 会在主页的搜索页面和左栏(也可能是其他地方)显示热门话题。点击每个主题将你转到所有相关的推文。

问题是如何设计这个功能。

如果你还记得我们在前一篇文章中所说的话,建议先拥有概要方法。简而言之,我会将问题分成两个子问题:1)如何获得热门话题候选? 2)如何对这些候选进行排名?

对于主题候选,有各种各样的想法。我们可以获得过去的 N 小时内最频繁的标签。我们也可以获得最热门的搜索查询。或者,我们甚至可能会抓取最近最受欢迎的推文,并提取一些常见词语或短语。但个人而言,我会采用前两种方法。

排名可以很有趣。最直接的方法是根据频率进行排名。但是我们可以进一步改进它。例如,我们可以整合像回复/转推/喜欢的数量,新鲜度等信号。我们也可能会添加一些个性化的信号,比如是否有很多关注/粉丝在谈论这个话题。

关注推荐

Twitter 还会向你显示关注推荐。实际上,这是在用户入驻和参与中起着重要作用的核心功能。

如果你玩这个功能,你会注意到 Twitter 主要有两种人给你看 - 你可能认识的人(朋友)和著名的用户(名人/品牌...)。

通过搜索用户的“关注图”,所有这些候选人都不难获得,而三个步之内的人都是很好的候选人。此外,也可以包含大多数追随者的账户。

问题是如何对他们排名,因为每次我们只能显示一些建议。我会倾向于使用机器学习系统来实现它。

有很多我们可以使用的特征,例如其他人是否关注过这个用户,共同关注/粉丝的数量,或任何基本信息(如位置)的重叠等等。

这是一个复杂的问题,有各种后续问题:

  • 如何为亿万级用户扩展系统?
  • 如何评估系统?
  • 如何为 Facebook 设计相同的功能(双向关系)?

Moments

Twitter 会向你展示当前标签中的趋势。这个功能比热门话题更复杂,我认为这里有必要简单地解释一下。

基本上,“Moments”会向你展示不同类别(新闻,体育,娱乐等)的有趣话题列表。对于每个话题,你还可以获得几个讨论它的顶级推文。所以这是一个探索目前情况的很好方式。

我很确定有很多设计这个系统的方法。一种选择是从新闻网站获取过去的 1-2 个小时内最热门的文章。对于每篇文章,找到与其相关的推文,并找出它属于哪个类别(新闻,体育,娱乐等)。然后,我们可以在 Moments 中将这篇文章作为热门话题展示。

另一个类似的方法是获得所有热门话题(与第一部分相同),找出每个话题的类别,在 Moment 中展示。

对于这两种方法,我们将有以下三个子问题来解决:A. 将每个推特/话题分类到一个类别(新闻,体育等)B. 在 Moments 中生成和排列热门话题 C. 为每个话题生成和排名推文。

对于 A,我们可以预先定义几个主题,并进行监督学习。或者我们也可以考虑聚类。事实上,微博中的文字,用户的个人资料,关注者的评论中包含了大量的信息,使算法准确无误。

对于 B 和 C 来说,因为它跟这篇文章的第一部分很相似,所以我就不谈了。

搜索

Twitter 的搜索功能是人们日常使用的另一种流行功能。如果你完全不知道搜索引擎是如何工作的,你可以查看本教程。

如果我们只讨论一般的推文搜索功能(不包括用户搜索和高级搜索),那么概要方法可能与 Google 搜索非常相似,只不过你不需要抓取网页。基本上,你需要建立索引,排名和检索。

如果你深入了解如何设计排名算法,事情会变得非常有趣。与 Google 不同,Twitter 搜索可能更关注新鲜度和社交信号。

最直接的方法是给每个功能/信号一个权重,然后计算每个推文的排名分数。那么我们可以按照分数对它们进行排名。功能可以包括回复/转推/喜欢的数字,相关性,新鲜度,用户的知名度等。

但是,我们如何评估排名和搜索?我认为最好定义一些核心指标,比如每天的搜索总数,搜索之后的推文点击事件等等,每天观察这些指标。他们也是无论怎么改变我们都应该关心的统计量。

总结

你会意识到许多功能都是数据驱动的,这并不意味着你必须是机器学习专家。但是对数据分析如何工作有一些概要性的想法,肯定是有帮助的。

好的工程师通常也会提出很好的问题。每当你有一个解决方案,试着问自己各种问题,来更好地了解系统。

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

results matching ""

    No results matching ""