【问题标题】:How to choose a partition key in DynamoDB for a chat app如何在 DynamoDB 中为聊天应用程序选择分区键
【发布时间】:2016-01-17 11:22:27
【问题描述】:

我需要将 DynamoDB 用于偶尔在活动当天使用的聊天应用程序。该应用将在特定的一天读取/写入数千条消息,之后几乎没有。

这是我的想法:

Table: Messages
HashKey: Event day name
SortKey: Message timestamp

我可以获取最近的 20 条消息(聊天应用程序通常只获取最新数据,不是吗?),但所有读/写将仅定向到一个分区。

我可以试试这个方法

Table: EventDayMessage
HashKey: Message timestamp

这样,读/写将分散到最近的消息,但由于没有排序键,我无法获取最近的消息。

在我的场景中方法 2 更好吗?我可以将什么用于排序键?还有其他更好的建议吗(除了切换数据库)?

【问题讨论】:

  • 当您说“将在特定日期读取/写入数千条消息”时,您预计每秒读取/写入的峰值数量是多少?这听起来像是数字是个位数,这意味着您可能不会遇到热分片问题,但如果数字是成百上千,您将需要考虑使用不同的哈希键来避免热分片问题。
  • @JaredHatfield 如果没有hot shard问题,方法1可以吗?
  • 是的。 SortKey/RangeKey 可以很好地与时间戳配合使用,因为它是排序的,您可以过滤大于/小于以有效地直接检索项目。这种方法的真正风险是节流,因为它不能很好地扩展。另一个问题是表中积累了大量旧数据。不过,将旧记录卸载到不同的表可能有助于解决这个问题。

标签: amazon-web-services amazon-dynamodb nosql


【解决方案1】:

我的第一个建议是转移到一个合适的数据库(如弹性搜索)来回答这种用法(基于时间的搜索)并为每天创建一个新索引

但如果你仍然想使用 dynamodb,一个好的 hack 可以是:

  • 如果您的应用程序每天写入/读取数千个消息,那么您不会得到很多分区(也取决于您的数据大小)。

假设您将拥有 3 个分区。 你的钥匙可以是这样的:

HashKey: Event day name + 'part_X' (where x is a number between 1-5. it can be a round rubin, or some '%' on a user_id or something like that)
SortKey: Message timestamp

所以在你的情况下,要获得最后 20 cmets: 您应该从每个分区中获取 20 个 cmets (hash = event_day_name_part_1, event_day_name_part_2 ..),然后返回到最近的顶部。

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多