Twitter 克隆的最佳 MongoDB 架构?

Posted

技术标签:

【中文标题】Twitter 克隆的最佳 MongoDB 架构?【英文标题】:Best MongoDB schema for twitter clone? 【发布时间】:2011-09-24 20:00:06 【问题描述】:

我知道有人问过类似的问题,但正在寻找一个基本问题的非常基本的答案。我是 MongoDB 的新手,正在制作一个 twitter 风格的应用程序(博客、关注者等),我想知道要使用的最佳架构。

现在我有(在一个非常高的水平):

Member 
  login: string,
  pass: string,
  posts: [
    
      title: string,
      blog: string,
      comments: [  comment: string  ]
    
  ]

还有更多内容,但这给了你想法。 现在的问题是我正在寻找添加“跟随”功能,但我不确定最佳路线。

我可以向成员添加“以下”嵌入式文档,但我只是不确定使用 mongoDB 最聪明的方法是什么。我的主要关注点显然是主要的“提要”页面,您可以在其中看到所有您关注的人的帖子。

【问题讨论】:

【参考方案1】:

这个问题与博客文章示例中使用的广泛程度以及如何为博客文章和 cmets 建模的问题相同。你只需要在这里应用相同的概念。您有以下选择:

嵌入式文档 专用集合和执行多个查询

利弊已被广泛讨论。嵌入式文档只能为 16MB 大,并且无法在 MongoDB 中返回匹配数组的各个部分……请自行选择。

不再赘述,因为如前所述:在许多关于“模式设计”的问题中都讨论了相同的问题。只需谷歌“Schema Design MongoDB”或在 SO 上查找相同的内容。

【讨论】:

我得到的简单博客或推文,但与我所要求的完全不同。我唯一的问题是添加“关注”功能。我正在寻找的是对最佳设置方式有更多经验意见的人。对于“关注”功能,我要么需要在成员文档中列出他们关注的所有人,要么我可以代替所有关注他们的人,等等。我看到的 Twitter 克隆都只是处理添加一个“推文”或博客。他们都没有提到设置“追随者”这个更棘手的问题。 您无法从数据模型的角度为您的问题抽象出给定的解决方案。通过专用集合或嵌入式文档处理在 MongoDB 中完成的各种性质的关系。每个文档都在解释这一点。请将其应用于您的问题 虽然我不同意 twitter 架构会类似于博客架构,但该架构已经广泛讨论了一般主题,因此这里和那里的一些谷歌应该会让你继续前进。【参考方案2】:

将“以下”数组添加到成员文档应该可以正常工作。它应该包含该成员关注的人的用户 ID。您的代码将必须检索列表并构造一个查询来检索这些用户的推文。由于 Mongo 是非关系型的,因此无法构建连接 Member 和 Tweet 集合并在单个查询中执行此操作的查询,但您应该能够通过在数据库服务器上执行此操作,使用服务器端代码执行来减少网络开销:http://www.mongodb.org/display/DOCS/Server-side+Code+Execution.

【讨论】:

在预计负载相当大的生产环境中,应谨慎使用服务器端代码执行和潜在的大型、不断增长的嵌入式阵列。 你似乎比我想得更多,@Remon。不断增长的数组是有道理的,但我不认为服务器端代码执行会比两次往返服务器更糟糕。 这不太明显,但这是由于 mongo 中的 JS 引擎是单线程的,因此无法利用所有可用的 cpu 资源。甚至 map/reduce 目前也受此困扰(这很奇怪,因为它基本上是在考虑并行性的情况下发明的)。如果该服务器端脚本的使用频率超过单个内核的处理能力,它将开始降低整个服务器的速度。所以是的,在相当多的情况下,两次往返实际上更快,或者至少更容易扩大规模;)尽管如此,测试并看看什么最有效。【参考方案3】:

这不是 Twitter 克隆的理想架构。主要问题是“posts”是一个不断增长的数组,这意味着 mongo 必须每隔几个帖子移动一次大量文档,因为它用完了文档填充。此外,文档的大小有一个硬性 (16mb) 限制,这使得此架构充其量是限制性的。

理想的架构取决于您是否期望 Twitter 的负载。就可维护性和易用性而言,“完美”的 mongodb 模式与我用于 Twitter 吞吐量的模式不同。例如,在前一种情况下,我会使用一个帖子集合,每个帖子都有一个文档。在高吞吐量场景中,我会开始为小组的帖子制作存储桶文档(例如,每个“获取更多”页面一个)。此外,在高吞吐量场景中,您必须在单独的用户时间线文档中保持关注者的时间线是最新的,而在低吞吐量场景中,您可以简单地查询它们。

【讨论】:

好点,@Remon,但 OP 的问题不是关于“帖子”数组。他/她确实提到这是模式的简化版本,问题是关于如何实现跟随。 感谢@Remon,这是很好的信息。该网站永远不需要扩展到 Twitter 的水平,但它也不适用于小型网站。它必须能够扩展,但没有什么疯狂的。就像@Martin Vilcans 提到的那样,“以下”方面的任何输入都会很棒。但是您提供的信息已经有所帮助。我想我害怕把它变成关系,所以我可能会过度补偿。 对不起,我完全误读了原始问题。以下应按照建议由嵌入式数组实现,因为仅使用一组 UUID 就很难达到 16mb 的限制。如果您打算在您的用户集合中粘贴大量其他数据,您可以将以下数组放入专用的每个用户文档中。然后,在用户发布新帖子时,您异步(在工作负载队列/消费者模型中使用消息队列)迭代该数组并更新所有关注者的时间线。这允许几乎无限扩展,并且接近当前的 Twitter 架构。

以上是关于Twitter 克隆的最佳 MongoDB 架构?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Twitter 克隆中并排设置侧边栏、Feed 和小部件?

将二维数组保存到 MongoDb 的最佳方法

使用 MongoDB 的类似 Twitter 的应用程序

使用 ELK 堆栈的最佳 Docker 日志记录架构

Mongodb 克隆集合

mongodb克隆本地collection