原文

更多文章请到 GitHub – HardwayLinka/cn-system-design: Translate some system design articles into Chinese,欢迎来点个 star 哦~

问题陈说

规划一个相似 Instagram 的相片共享平台,用户能够上传自己的相片,并共享给粉丝。随后,用户将能够检查包括他们所重视的一切其他用户的帖子的个性化 feed。

搜集需求

范围内

运用程序应该能够支撑以下需求。

  • 用户应该能够上传相片并检查自己上传的相片。
  • 用户应该能够重视其他用户。
  • 用户能够检查包括他们所重视用户的帖子的 feed。
  • 用户应该能够点赞和谈论这些帖子。

超出范围

  • 发送和接纳来自其他用户的音讯。
  • 生成根据机器学习的个性化引荐,以发现与自己兴趣相关的新人物、相片、视频和故事。

高层次规划

架构

Instagram 的系统设计

当服务器从客户端接纳到一个操作恳求 (post, like 等) 时,它履行两个并行操作: i) 在数据存储中耐久化操作 ii) 在 pub-sub 模型的流数据存储中发布操作。之后,各种服务 (例如用户订阅服务,媒体货台服务) 从流数据存储中读取操作并履行它们的特定使命。==流数据存储使系统具有可扩展性,以支撑未来的其他用例== (例如媒体查找索引、位置查找索引等)。

风趣的现实: 在这次 演讲 中,Instagram 的工程总监 Rodrigo Schmidt 谈论了他们在扩展 Instagram 的数据基础设施时所面临的不同应战。

系统组件

系统将由几个微服务组成,每个微服务履行一个单独的使命。咱们将运用图数据库 (如 Neo4j) 来存储信息。咱们挑选图数据模型的原因是,咱们的数据将包括数据实体之间的复杂联系,如用户、帖子和谈论,作为图的节点。在此之后,咱们将运用图的边来存储重视、点赞、谈论等联系。此外,咱们能够运用像 Cassandra 这样的柱状数据库来存储用户订阅、活动和计数器等信息。

Instagram 的系统设计

组件规划

在 Instagram 上发帖

Instagram 的系统设计

图 2: 在 Instagram 上发帖的同步和异步流程

当用户在 Instagram 上发布相片时,首要履行两个进程。首要,同步进程担任在文件存储上上传图画内容,在图数据存储中耐久化媒体元数据,向用户回来承认音讯并触发该进程更新用户活动。第二个进程是异步发生的,经过在柱状数据存储 (Cassandra) 中耐久化用户活动,并触发进程预先核算非名人用户 (具有几千名粉丝) 的粉丝动态。咱们不会对名人用户 (具有 100 万 + 粉丝) 的订阅进行预核算,由于将订阅分发给一切粉丝的进程将是极端核算和 I/O 密布的。

API 规划

咱们在下面供给了在 Instagram 上发布图片的 API 规划。咱们将运用 multipart/form-data 内容类型在一个恳求中发送文件和数据。MultiPart/Form-Data 包括一系列的部分。每个部分估计包括一个 content-disposition 头 [RFC 2183],其间 disposition 类型为“form-data”。

Instagram 的系统设计

Instagram 的系统设计

预核算 feed

Instagram 的系统设计

当非名人用户在 Instagram 上发布帖子时,这个进程就会履行。当一条音讯被添加到用户订阅服务队列时,它会被触发。音讯添加到队列后,用户 Feed 服务会调用重视者服务,获取该用户的重视者列表。之后,这篇文章就会被添加到列式数据存储中一切重视者的 feed 中。

获取用户 Feed

Instagram 的系统设计
当用户恳求 feed 时,那么将涉及两个并行线程来获取用户 feed,以优化推迟。第一个线程将从用户重视的非名人用户那里获取 feed。这些提要由上面的“预核算提要”一节中描述的扇出机制填充。第二个线程担任获取该用户所重视的名人用户的 feed。之后,User Feed Service 会合并来自名人和非名人用户的 Feed,并将合并后的 Feed 回来给恳求 Feed 的用户。

API 规划

Instagram 的系统设计

Instagram 的系统设计

数据模型

图数据模型

Instagram 的系统设计

咱们能够运用图数据库,如 Neo4j,它将用户信息、帖子、谈论等数据实体存储为图中的节点。节点之间的边用来存储数据实体之间的联系,比如重视者、帖子、谈论、点赞和回复。一切的节点都被添加到一个名为 nodeIndex 的索引中,以实现更快的查找。咱们挑选了这种根据 NoSQL 的解决方案而不是联系型数据库,由于它供给了逾越两层的层次结构的可扩展性,并且由于 NoSQL 数据存储的无方式行为而具有可扩展性。

图数据库支撑的示例查询

获取 Jeff Bezos 的一切重视者

Node jeffBezos = nodeIndex.get(“userId”, “user004”);
List jeffBezosFollowers = new ArrayList();
for (Relationship relationship: jeffBezos.getRelationships(INGOING, FOLLOWS)) {
    jeffBezosFollowers.add(relationship.getStartNode());
}

获取比尔盖茨的一切帖子

Node billGates = nodeIndex.get(“userId”, “user001”);
List billGatesPosts = new ArrayList();
for (Relationship relationship: billGates.getRelationships(OUTGOING, POSTS)) {
    billGatesPosts.add(relationship.getEndNode());
}

获取一切杰夫贝佐斯谈论过的比尔盖茨的帖子

List commentsOnBillGatesPosts = new ArrayList<>();
for(Node billGatesPost : billGatesPosts) {
     for (Relationship relationship: billGates.getRelationships(INGOING, COMMENTED_ON)) {
    commentsOnBillGatesPosts.add(relationship.getStartNode());
     }
}
List jeffBezosComments = new ArrayList();
for (Relationship relationship: jeffBezos.getRelationships(OUTGOING, COMMENTS)) {
    jeffBezosComments.add(relationship.getEndNode());
}
List jeffBezosCommentsOnBillGatesPosts = commentsOnBillGatesPosts.intersect(jeffBezosComments);

柱状数据模型

Instagram 的系统设计

咱们将运用 Cassandra 等列式数据存储来存储用户提要和活动等数据实体。每行将包括用户的 feed/活动信息。咱们还能够有一个根据 TTL 的功能来驱赶旧的帖子。数据模型看起来相似于:

User_id -> List

风趣的现实: 在这次 演讲 中,Instagram 核心基础架构团队的软件工程师 Dikang Gu 提到了他们如何运用 Cassandra 来服务要害用例、高可扩展性需求以及一些痛点。

流数据模型

咱们能够运用云技能,如 Amazon Kinesis 或 Azure Stream Analytics 来搜集、处理和分析实时流数据,以取得及时的见地和对新信息的快速反应。一个新的点赞、谈论等)。咱们在下面列出了一些首要流数据实体和动作的反规范化方式。

Instagram 的系统设计

上面的数据实体AB显现了包括用户及其帖子的非规范化信息的容器。随后,数据实体CD表明用户可能采纳的不同操作。实体C表明用户点赞一篇文章的事件,实体D表明用户重视另一个用户时的动作。这些动作由相关的微服务从流中读取并进行相应的处理。例如,likeevent 能够被 媒体计数器服务 读取,并用于更新数据存储中的媒体计数。

优化

咱们将运用一个具有根据 LRU 的驱赶战略的缓存来缓存活泼用户的用户源。这不只将削减向用户显现用户源的整体推迟,而且还将防止用户源的重新核算。

Instagram 的系统设计

优化的另一个范围在于,在用户订阅中供给最好的内容。咱们能够经过对用户重视的人的新 feed(用户上次登录后生成的 feed) 进行排名来实现这一点。咱们能够运用机器学习技能,经过为单个 feed 分配分数来对用户 feed 进行排名,这些分数将表明点击、喜爱、谈论等的概率。咱们能够经过一个特征向量来表明每个提要,该特征向量包括关于用户、提要以及用户与提要中的人的交互信息 (例如,用户是否点击/喜爱/谈论了故事中的人之前的提要)。很明显,feed 排名中最重要的特征将与交际网络相关。下面列出了一些了解用户网络的要害。

  • 亲近重视的用户是谁?例如,一个用户是埃隆马斯克的亲近重视者,而另一个用户可能是戈登拉姆齐的亲近重视者。
  • 该用户总是喜爱谁的相片?
  • 用户最感兴趣的是谁的链接?

咱们能够运用 深度神经网络,它将采纳咱们训练模型所需的几个特征 (> 100K dense features)。这些特征将经过 n-fold 层传递,并将用于猜测不同事件 (点赞、谈论、共享等) 的概率。

风趣的现实: 在这次 演讲 中,Lars Backstrom, Facebook 工程副总裁谈论了为用户创立个性化新闻源所做的机器学习。他谈到了他们在初始阶段运用的经典机器学习方法,经过运用决策树和逻辑回归来个性化新闻源。然后他谈到了他们在运用神经网络时观察到的改善。

参考文献

  • www.youtube.com/watch?v=_Bf…
  • www.youtube.com/watch?v=hnp…
  • instagram-engineering.com/what-powers…
  • instagram-engineering.com/types-for-p…
  • highscalability.com/blog/2012/4…
  • docs.oracle.com/cloud/lates…
  • instagram-engineering.com/under-the-h…