如何使用DynamodB在聊天应用程序中查询聊天列表时显示最后一条消息



我想使用DynamoDB构建一个聊天应用程序,但在设计架构时遇到了困难。所以,我不需要像电报这样复杂的聊天应用程序,它相当简单。这些是我需要的查询:

  1. 列出用户的聊天记录(每个聊天记录还有lastMessageTimestamp、unreadCound和lastMessage(
  2. 列出聊天信息
  3. 列出聊天用户(这是可选的(

到目前为止,我已经想出了这个设计

并查询以获取数据

问题是,要获得关于lastMessage和readyCount的数据,我需要在创建消息时更新2行。事务应该用于此,但我不认为DynamoDB适合高事务应用程序。有没有更好的方法(也许使用不同的技术(?

第页。S.我知道在遇到瓶颈之前我应该使用RDB,但我已经使用RDB完成了这项工作,现在想尝试使用NoSql。我也看过MongoDB,但如果我对聊天和消息有不同的模式,并且想同步更新它们,它就不支持事务。我也可以在DynamoDb中使用流来更新值,但这不是实时的(

更新

我也可以在mongodb中的聊天中嵌入消息,但这是可扩展的吗?我可以将消息作为堆栈推送,这样查询最新消息就很容易了,但分页或无限滚动呢,有没有办法让这些查询快速?此外,如果嵌入的消息超过了文档大小限制,该如何缩放?

DynamoDB绝对是一个适合您需求的数据库,但我认为您提出的设计不是正确的方法。

你的要求是(我从你原来的帖子中分了一些(:

  1. 列出用户聊天
  2. 列出聊天信息
  3. 列出聊天用户(这是可选的(
  4. 获取聊天的最后一条消息
  5. 获取聊天+用户的未读计数

如果您有一个DDB表,其中包含:

  • PK:chat_id
  • SK:时间戳:message_id

和带有的GSI

  • PK:user_id
  • SK:时间戳:message_id

您可以查询chat_id以完成第2项要求,获取聊天中的所有消息,按发布时间排序。

您可以有第二个表来处理权限,如:

  • PK:user_id
  • SK:chat_id

使用GSI:

  • PK:chat_id
  • SK:user_id

您可以在权限表上查询一个user_id的所有chat_id,在权限gsi表上查询聊天中的所有user_id,满足要求2&3.

对于要求4,这很容易,因为你只需在聊天表上进行查询,最大计数为1,这将为你提供最后一条消息和最后一次发布的时间。

要求5有点棘手,但如果你能跟踪特定用户最后一次查看聊天的时间,你可以在排序键上使用范围表达式进行查询,例如timePosted>=timeLastSeen,而您收到的邮件数就是未读计数。对我来说,将上次查看的时间存储在客户端是有意义的,但如果你想将其存储在服务器端,你可以制作第三个表。

上面的所有操作都是高度可扩展的,即使在同一聊天中有100个用户,也不会遇到任何并发问题。

最新更新