gpt4 book ai didi

amazon-dynamodb - 时间序列数据的高效 DynamoDB 模式

转载 作者:搜寻专家 更新时间:2023-10-30 23:47:00 25 4
gpt4 key购买 nike

我们正在构建一个对话系统,该系统将支持 2 个用户之间(以及最终 3 个以上用户)之间的消息。每个对话都会有一组可以参与/查看对话的用户以及一组消息。 UI 将显示特定对话中最近的 10 条消息,并能够“分页”(渐进式滚动?)消息以查看更早以前的消息。

计划是将对话和参与者存储在 MSSQL 中,然后仅将消息(代表有可能增长到非常大的数据)存储在 DynamoDB 中。消息表将使用对话 ID 作为散列键,使用消息 CreateDate 作为范围键。此时 session ID 可以是任何值(整数、GUID 等)以确保跨分区的消息均匀分布。

为了避免热分区,一个建议是为时间序列数据创建单独的表,因为通常只会访问最新的数据。当我们需要在用户滚动/翻页时为他们拉回以前的消息时,这会导致问题吗?因为我们必须跨多个表查询以拼凑一批消息?

是否有不同/更好的方法来存储可能不常访问但可以快速访问的时间序列数据?

最佳答案

我想我们可以假设有许多并行的“活跃”对话,对吧?意思是 - 我们不处理所有流量都与单个对话(或几个)有关的情况。

如果是这种情况,并且您使用随机数/GUID 作为您的 HASH 键,您的对象将均匀分布在整个节点中,据我所知,您不应该害怕偏斜。由于 CreateDate 只是 RANGE 键,同一对话的所有消息都将存储在同一节点上(基于它们的 ConversationID),所以它实际上并不重要如果您查询最新的 5 条记录或最早的 5 条记录。在这两种情况下,它都是使用 CreateDate 上的索引进行查询。

我不会将数据分成多个表。我看不出它给你带来了什么好处(考虑到上一节),它会让你的管理生活成为一场噩梦(想象一下改变所有表的吞吐量,或者备份它们,或者创建一个 CloudFormation 模板来创建你的整个环境) .

我会关心拉取历史时返回的消息数量。我想您将通过一个 query 命令实现它,将 ConversationID 作为 HASH 键并按 CreationDate 降序排列结果。在那种情况下,我将只返回结果的第一页(我认为它返回最多 1MB 的数据,因此取决于平均消息长度,它可能足够或不够)并且只有当用户继续滚动时,才获取下一页。否则,您可能会在非常长的对话中使用大量吞吐量,而且无论如何,客户端真的不想长时间等待数兆字节的数据出现在屏幕上。

希望对你有帮助

关于amazon-dynamodb - 时间序列数据的高效 DynamoDB 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27364164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com