在mongodb中实现facebook风格状态消息系统

时间:2014-07-25 10:20:21

标签: node.js mongodb mongoose rabbitmq

我们如何在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,我必须遍历用户在其朋友列表中的所有朋友,然后获取所有状态。 我必须每次为每个朋友做这个(页面刷新/新登录)。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

假设每个用户可能有几个朋友,并且这些朋友每天多次刷新他们的时间线,你可以认为阅读比写作更频繁。这意味着从纯粹的性能角度来看,您将优化读取访问,而不是写入访问,并将接收器与消息一起存储。

但是,请记住语义。如果作者的朋友列表在发布状态消息后发生更改,该怎么办?

  • 你想让消息从任何前朋友的时间线上消失吗?
  • 您是否希望消息显示在他们所创建的新朋友的时间轴中?

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

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