【问题标题】:DynamoDB avoiding SCAN for time-series datasetDynamoDB 避免对时间序列数据集进行 SCAN
【发布时间】:2016-01-14 00:12:37
【问题描述】:

我有兴趣计算两个时间点之间与唯一可识别资源的用户交互。

我的用例是:

  1. 检索个人 resourceId 的总计数(在时间 x 和时间 y 之间)
  2. 生成按计数排序的前 resourceIds 列表(在时间 x 和时间 y 之间)

理想情况下,我希望使用 DynamoDB 来实现这一点。在发电机中对时间序列数据进行排序看起来有挑战,我在尝试对数据建模时遇到了一些反最佳实践。

到目前为止的数据模型

下采样表可能如下所示,其中count 是在timebin 范围内与resourceId 的交互次数。

| resourceId    | timebin   | count |
|---------------|-----------|-------|
|(Partition Key)| (Sort Key)|       |

每个资源的总交互计数是每个具有相同resourceId 的项目中的计数属性的总和。由于感兴趣的是无限的“所有时间”计数,因此较旧的事件永远不会过时,但它们可以进一步下采样并滚动到更大的时间段中。

使用上述架构,用例 1 是通过使用其哈希键对资源进行排队并使用排序键强制执行时间限制来实现的。然后可以在应用端计算总计数。

对于用例 2,我希望实现相当于 SQL GROUP BY resourceId, SUM(count) 的效果。为此,数据库需要返回与提供的timebin 约束匹配的所有项目,而不考虑resourceId。然后可以在应用程序端执行计数的分组和求和。

问题:使用上述架构需要进行全表扫描。

这显然是我想避免的。

可能的解决方案

  1. 大量缓存用例 2 的查询,以便使用扫描,但很少使用(例如,每天一次)。
  2. 维护一个聚合表,例如,将预定义的timeRanges 作为分区键,将相应的count 作为排序键。

| resourceId | timeRange (partition)  | count (sort) |
|------------|------------------------|--------------|
|  1234      | "all_time"             | 9999         |
|  1234      | "past_day"             | 533          |

这里,“all_time”有一个固定的 FROM 日期,因此可以在每次收到 resourceId 事件时递增。然而,“past_day”有一个移动的 FROM 日期,因此需要使用更新的 FROM 和 TO 标记定期重新聚合。

我的问题

有没有更有效的方法来为这些数据建模?

【问题讨论】:

    标签: time-series amazon-dynamodb


    【解决方案1】:

    根据您对表的描述,resourceId 是表的哈希键,如果您在单个哈希键中执行聚合,则可以通过查询来完成。此外,如果 timebin(范围键)可以使用大于和小于运算符进行比较,您将能够通过有效的查询直接获取所需的记录,然后在应用程序端汇总计数。

    但是,这不会完成您的第二点,因此需要额外的工作来满足这两个要求。


    维护汇总表似乎是全球排行榜的合乎逻辑的方法。我建议将 DynamoDB Streams 与 AWS Lambda 结合使用,以近乎实时地维护该聚合表。这遵循 AWS 最佳实践。


    定期扫描和聚合方法也是有效的,根据您的表大小可能更实用,因为它实现起来更直接,但有很多事情需要注意...

    确保扫描的进程与您的主要应用程序执行逻辑分开。实时填充此缓存是不切实际的。如果表中的项目数只有几百个或更少,表扫描仅适用于实时请求。

    确保对扫描进行速率限制,以免此过程消耗所有 IOPS。或者,您可以在此时间段内大幅提高 IOPS,然后在该过程完成后再降低。另一种选择是制作一个尽可能窄的 GSI 以进行扫描,将 GSI 专用于该进程将避免需要速率限制,因为它可以消耗它想要的所有 IOPS 而不会影响表的其他用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 2021-01-04
      • 2015-09-21
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2011-03-18
      相关资源
      最近更新 更多