我们如何在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。
答案 0 :(得分:0)
假设每个用户可能有几个朋友,并且这些朋友每天多次刷新他们的时间线,你可以认为阅读比写作更频繁。这意味着从纯粹的性能角度来看,您将优化读取访问,而不是写入访问,并将接收器与消息一起存储。
但是,请记住语义。如果作者的朋友列表在发布状态消息后发生更改,该怎么办?
当这些问题的答案是肯定的时,你应该确定读取时的接收器而不是写入。
还有第三种选择可能值得考虑:不要由发送者处理消息,由接收者处理它们。当有人发布消息时,为每个朋友创建消息的单独副本,并将其另存为单独的文档。然后,您可以通过查询消息集合来获取用户的所有消息,以获取他们是接收者的消息。然后,朋友/非朋友操作需要检查是否需要添加/删除任何消息。这种方法的主要缺点是,拥有大量朋友的用户在发布内容时会产生非常高的写入负荷。