【问题标题】:What is the design & architecture behind facebook's status update mechanism?facebook 的状态更新机制背后的设计和架构是什么?
【发布时间】:2011-10-27 17:25:20
【问题描述】:

我正在计划创建一个社交网络,但我认为我不太了解 facebook 的状态更新模块是如何设计的。希望我能在这里找到一些帮助。在算法和数据结构层面,在社交网络中创建状态更新机制的最有效方法是什么?

对所有朋友进行全表扫描,然后对他们的更新进行排序是非常幼稚和昂贵的。我们是否使用某种基于散列或其他东西的机制?请告诉我。

P.S:我说的不是他们的 EdgeRank 算法,而是基本的状态更新。他们如何从数据库中找到并获取它们?

提前感谢您的帮助!

【问题讨论】:

标签: algorithm facebook status


【解决方案1】:

这是回答您问题的great presentation。具体答案在 55:40 左右出现,但我建议您观看整个演示文稿以了解该解决方案如何适应整个架构。

简而言之:

  1. 特定服务器(“叶”)存储特定用户的所有提要项目。因此,您每个朋友的数据都完全存储在特定的目的地。
  2. 当您想要查看您的新闻提要时,其中一个聚合器服务器会向您的朋友的所有叶服务器发送请求并对结果进行排名。聚合器根据每个朋友的用户 ID 知道将请求发送到哪些服务器。

当然,这是非常简化的。这之所以有效,是因为所有这些都是 memcached,系统旨在最大限度地减少延迟,一些排名是在包含朋友的 feed 项的叶子服务器上完成的,等等。

您真的不希望访问数据库以使其以合理的速度工作。 FB 主要使用 MySql 作为键值存储;在他们的规模上加入表是不可能的。然后他们将 memcache 服务器放在数据库和应用程序服务器的前面。

话虽如此,在遇到扩展问题之前不要担心(当然,除非您是为了好玩才担心它们。)在第一天,扩展是您遇到的最小问题。

【讨论】:

  • 嗨尼克,这是一个有见地的演示,虽然对我的知识库来说有点压倒性!非常感谢您的链接。请原谅我的后续问题的幼稚。但是我如何在最低的表格单元级别可视化“叶”服务器和“聚合”服务器。 1 个叶和聚合服务器专用于社交网络上的每个用户?
  • 想象一个巨大的数据库表,它有两列:id、data。他们使用sharding 根据 id 拆分此表。因此 ids 1-1000 将驻留在 server1 上,ids 1001-2000 将驻留在 server2 上,依此类推。这些服务器中的每一个都是 FB 所说的“叶子”。 (即分片)现在,如果您想对 id 为 30 的东西和 id 为 1030 的东西进行 SUM(),则不能,因为它们位于不同的服务器上。这就是其中一个聚合器服务器出现的地方。它进入两个叶服务器并获取行。然后它执行 SUM() 并返回结果。
  • 谨慎行事,因为在游戏中按比例构建可能会让您养成坏习惯(例如将所有内容存储在键值存储中而不利用 JOIN),从而弊大于利。 ) 这一切都取决于你想学什么。由于其规模,FB 有非常特殊的需求。然而,当他们开始时,他们使用单个 MySQL 数据库服务器,其中包含许多表、许多列,并为每个请求连接表,就像其他人一样。对于 100 个项目中的 99 个项目,这仍然是要走的路。
  • 非常感谢尼克的解释。这确实为我消除了很多疑问。
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多