创建照片分享应用

原文:Create a Photo Sharing App

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

在我发布我们的第一个系统设计面试问题后 - 如何设计 twitter,我们得到了更多这样的教程的很多请求。

Gainlo 团队亲自挑选了一系列既经典又易于扩展的系统设计面试问题。 因此,我相信这些问题可以帮助你更好地了解如何进行系统设计面试。

同样值得注意的是,Gaino 团队提供的分析仅用于系统设计面试展示。 生产中的真正解决方案可能非常不同,因为我们在这里极大简化了问题。

创建照片分享应用

如何创建像 Instagram 的照片分享应用?

更具体地说,该系统允许人们相互关注,分享/评论/喜欢图片,也许还有一些其他功能,如探索,广告等等。

我们想在这里分析这个问题有几个原因。 首先,图片共享系统非常流行。 我没有选择一个奇怪问题,在现实世界中几乎没有应用。 相反,有很多像 Pinterest,Flickr 等类似的产品。

其次,问题是通用的,这在系统设计面试中是非常普遍的。 通常,面试官不会要求你解决一个明确的问题,这正是让很多人不舒服的东西。

最后,分析涵盖了可扩展性,数据库,数据分析等广泛的主题,以便它可以在其他系统设计面试问题中重用。

概要解决方案

我们在以前的文章中多次强调,建议先从概要解决方案开始,然后再深入研究各种细节。

这种方法的优点是,你能清楚你想要解决什么问题,而且面试官不太可能困惑。

为了设计图片共享系统,确定两个主要对象 - 用户对象和图片对象是相当直接的。

就我个人而言,我想使用关系数据库来解释,因为它通常更容易理解。在这种情况下,我们将有用户表,其中包含名称,电子邮件,注册日期等信息。图片表也是一样。

此外,我们还需要存储两个关系 - 用户关注关系和用户图片关系。这是非常自然的,值得注意的是用户关注不是双向的。

因此,拥有这样的数据模型可以让用户相互关注。为了检查用户的信息流,我们可以从他关注的人中提取所有照片。

潜在的规模问题

上面的解决方案应该可以正常工作。作为一名面试官,我总是想问,当我们拥有数百万用户时,如何解决这个问题会出现什么问题?

这个问题是一个好方法,测试候选人是否可以预见潜在的规模问题,优于只问你如何解决某个问题。

当然,没有标准的答案,我想列举几个想法作为灵感。

1. 响应时间

当用户达到一定数量时,通常会看到响应时间慢成为瓶颈。

例如,一个开销大的操作是呈现用户的信息流。服务器必须检查用户所关注的每个人,从中获取所有图片,并根据特定的算法对其进行排名。当用户关注​​大量图片的人时,操作可能会很慢。

这里可以应用各种方法。如果是瓶颈,我们可以升级排名算法。如果按照日期排序,我们可以使用无限滚动功能,从每个人中读取前 N 张最近的图片。或者我们可以使用离线流水线,预先计算一些可以加快排名的信号。

关键是,不可能有人关注数百个用户(谁说的?),但可能有人有成千上万的图片。所以核心是加快图片的获取和排名。

2. 架构扩展

当只有数十个用户和图片时,我们可以从一台服务器存储和提供所有的东西。

但是,对于数百万用户来说,单个服务器远远不够,由于存储,内存,CPU 限制等问题。这就是为什么当有大量请求时,很常看到服务器崩溃。

为了扩展架构,经验法则是面向服务的架构(SOA)优于单一的应用。

不要把所有的东西放在一起,最好把整个系统按服务分成小的组件,并把每个组件分开。例如,我们可以将数据库与负载均衡器的 Web 应用(在不同的服务器上)分开。

3. 数据库扩展

即使我们把数据库放在一个单独的服务器上,也不能存储无限的数据。

在某个时候,我们需要扩展数据库。对于这个特定的问题,我们可以通过将数据库分割成像用户数据库,评论数据库等子数据库来进行垂直分割(Partition),或者根据美国用户,欧洲用户等属性进行分割来进行水平分割(Sharding)。

你可以查看这篇文章来深入分析可扩展性问题。

信息流排名

讨论如何在用户的时间线中对信息流(图片)进行排名也很有趣。

尽管按照时间顺序排列所有内容是相当简单的,但这是否是最好的方法? 这样的开放式问题在系统设计面试中非常普遍。

其实,可以有不少的选择。 例如,结合时间和用户喜欢这张照片的可能性的算法绝对是有希望的。

为了设计这样的算法,一个常用的策略是提出一个评分机制,将各种特征作为指标并计算每张图片的最终分数。

直观地说,重要的功能包括喜欢/评论的数量,用户是否喜欢许多照片的所有者等等。 由于简单,可以使用线性组合作为起点。

然后,值得尝试像协同过滤这样的更先进的机器学习算法。

图像优化

由于图片共享系统充满了图像,我想问一下可以优化哪些图片相关的内容?

首先,通常建议在生产中分开存储所有照片。 Amazon S3 是最受欢迎的存储系统之一。但是,你不需要能够提出这个。

重点是图像通常很大,很少更新。所以独立的图像存储系统有很多优点。例如,当文件是静态的时候,缓存和复制可以简单得多。

其次,为了节省空间,应该压缩图像。一种常用的方法是仅存储/提供压缩版本的图像。实际上,Google 照片使用这种方式,并提供无限的免费存储。

总结

在这篇文章中,还有一些话题没有涉及,比如如何在 Instagram 中构建探索功能。我希望你可以花一些时间考虑一下。

另外供参考,你可以查看 Instagram 的基础设施Flickr 架构。但是,我不认为他们对系统设计面试非常有帮助,因为他们太过专注于技术而不是设计原则。

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