我最近一直在做我的聊天应用程序设计。到目前为止,我有2个设计在脑海中。
第一个是嵌入聊天消息和成员。成员将有未读消息计数和最后一次阅读时间。这种方法的问题是大量收集问题。并且消息不会随聊天一起查询,所以可能也浪费内存。
first design
第二个设计是有一个单独的消息集合,其中引用了聊天。成员仍然将被嵌入。
但是使用第二种方法时,查询会出现问题。当我插入新消息时,我需要使用lastMessage
更新聊天,并更新用户unreadCount
。但是我想在没有事务的情况下完成这一操作,因为这太昂贵了,而且对于高负载来说并不是真正可伸缩的(或者至少会很贵)。我想过在没有事务的情况下这样做,但当两个用户同时插入消息时可能会出现竞态条件,但是首先发送的消息会用最后一条消息更新聊天。我可以通过更新聊天来解决这个问题。但是如果我对mongo的请求失败了呢?这将是一个不一致的问题,我该如何解决这个问题(可能使用队列)?
1条答案
按热度按时间fzsnzjdm1#
因为
lastMessage
和unreadCount
基本上是派生值,所以我建议您不要将它们分开存储,因为当您将它们存储在两个不同的位置时,您总是会遇到争用条件和保持数据同步的问题。解决方案:在查询实际聊天对象时,您应重点检索派生数据。在您的情况下,可能适合使用其中包含
$lookup
阶段的聚合管道。为了防止瓶颈,您应考虑为此类关系创建索引。