【问题标题】:Implement facebook style status message system in mongodb在 mongodb 中实现 facebook 风格的状态消息系统
【发布时间】:2015-09-16 14:47:37
【问题描述】:

我们如何在 mongodb 中实现类似 Facebook 的状态消息系统(使用 mongoose),每当任何给定用户发布他的状态时,它都会在他所有朋友的时间轴上广播。

它不一定是实时的,会有一个刷新按钮来获取最新的状态。

这是我想出的:

A 计划:

status(collection)
    id, user_id(reference), status_msg

好处:写入速度更快

B 计划:

status(collection)
    id, user_id(reference), status_msg, friends_list[sub-document]

好处:读取速度更快

使用计划 A,我必须遍历用户在其好友列表中的所有好友,然后获取所有状态。 我每次都必须为每个朋友这样做(页面刷新/新登录)。

使用计划 B,我只需获取当前用户在 friends_list 中的状态。

我想知道您对此的意见和建议?

有没有更好的方法来解决这个问题?

我也想知道如何在这里使用rabbitMQ来提高效率并减少不必要的db i/o。

【问题讨论】:

    标签: node.js mongodb mongoose rabbitmq


    【解决方案1】:

    假设每个用户可能有几个朋友,并且这些朋友每天都会刷新他们的时间线数次,您可以假设阅读的频率会比写作的频率高得多。这意味着从纯粹的性能角度来看,您将针对读取访问进行优化,而不是针对写入访问进行优化,并将接收者与消息一起存储。

    但是,请牢记语义。如果作者的朋友列表在他们发布状态消息后发生了变化怎么办?

    • 您希望消息从任何前朋友的时间线中消失吗?
    • 您希望消息出现在他们结交的任何新朋友的时间线中吗?

    当这些问题的答案是肯定的时,您应该在读取而不是写入时确定接收者。

    还有第三个选项可能值得考虑:不要由发送者处理消息,由接收者处理它们。当有人发布消息时,为他们的每个朋友创建消息的单独副本并将它们保存为单独的文档。然后,您可以通过在消息集合中查询他们作为接收者的消息来获取用户的所有消息。然后加好友/取消加好友操作需要检查需要添加/删除的任何消息。这种方法的主要缺点是,拥有大量朋友的用户在发布内容时会产生非常高的写入负载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多