【问题标题】:Twitter exercise with MongoDB and lack of transactions?Twitter 使用 MongoDB 练习并且缺少交易?
【发布时间】:2012-10-10 17:59:40
【问题描述】:

我试图弄清楚 MongoDB 是否需要事务以及为什么不能将所有内容都放在一个文档中。我也知道 twitter 使用确实有交易的 HBase,所以我想到了一条推文和观察者。

如果我发布推文,它会毫无问题地插入。但是我或其他人如何找到我的推文?我听说 mongodb 有索引,所以也许我可以索引作者并找到我的推文,但是我无法想象如果每个人都这样做会很有效率。还必须对时间进行索引。

所以据我了解(我想我看到了一些推特发布的幻灯片)推特有一个“时间线”,所以每次一个人发推文时,推特都会在每个人的时间线中插入 tweetid,该时间线按日期索引,当给定用户浏览时,它会抓取可用推文按时间排序。

在 mongodb 中如何实现?我能想到的唯一解决方案是在推文文档中有一列写着 {SendOut:DateStamp},完成后将其删除。如果它在第一次尝试时没有完成(检查时间戳以猜测它现在是否应该完成),那么我需要检查所有观察者以查看谁没有收到它,如果没有则插入。但也因为没有交易,我想我需要索引 SendOut 列?这个解决方案行得通吗?我如何有效地插入推文并将其提供给所有观看用户的人? (如果此解决方案不起作用)

【问题讨论】:

    标签: mongodb twitter


    【解决方案1】:

    听起来您在描述类似于 pub/sub 的模型。你不能用用户最后阅读的每个用户对象来跟踪最后一篇文章(按日期)吗?用户会以相同的方式请求推文,使用包括时间在内的各种索引。

    我不确定您需要事务处理什么,但 Mongo 确实支持原子操作。

    [更新]

    换句话说,每个用户的对象都存储了最后一条推文读取/发送的日期时间。显然,您还需要订阅作者 ID 的列表。要获取新的推文,您需要通过 author_id,time 属性索引推文,然后按时间排序。

    通过使用用户对象的最后读取日期并将其用作推文集合的二级索引,我认为您不需要发布/订阅或事务来执行此操作。

    我可能会遗漏一些东西。

    【讨论】:

    • 我不知道你的意思是“你不能用用户最后阅读的每个用户对象来跟踪最后一个帖子(按日期)吗?”我不认为时间是一个很好的指标,因为每分钟有数千条推文,大多数你不关心。如果您观看 100 人(这是一个低数字)并且帖子由他们的作者编入索引,那么对于该服务器上的 1k 用户来说,第二次搜索他们的 100 位朋友以及时间戳方面的额外工作听起来可能需要大量工作。我认为时间表或交付清单将是唯一合理的解决方案,但除了在我的 Q 中提到之外,我想不出如何实施
    • 我已经扩展了帖子 - 这有意义吗?
    猜你喜欢
    • 2016-08-06
    • 2014-07-22
    • 2016-03-17
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多