通过查询最大 1MB 的 DynamoDB 可以获得的最佳性能是多少?

What is the best performance I can get by querying DynamoDB for a maximum 1MB?

我正在使用 DynamoDB 存储数据。我看到 1MB 是查询 return 的硬限制。我有一个案例查询 table 以在一个分区中获取 1MB 的数据。我想知道我可以获得的最佳性能。

根据 DynamoDB 文档,一个分区最多可以有 3000 个 RCU。如果我发送最终一致性读取,它应该支持每秒响应 3000 * 8KB = 24000KB = 23MB。

如果我发送一个查询请求以从一个分区获取 1MB,这是否意味着它应该响应 1/23 秒 = 43 毫秒?

我在 lambda 中进行测试,在启用 XRay 的情况下向 DynamoDB 发送查询。它向我展示了基于 XRay 跟踪的查询多花费了 300 毫秒。所以我不明白为什么会导致长时间延迟。

如果我想将延迟降低到个位数毫秒,我该怎么做?我不想拆分分区,因为 1MB 并不是很大。

DynamoDB 确实能够实现个位数毫秒的延迟,但如果项目大小足够小以适合 1 个 RCU。在 <10 毫秒内从数据库中读取 1 MB 的数据本身就是一项具有挑战性的任务。

以下是您可以尝试的方法:

  1. 将您的读取操作一分为二。

一个人将使用 ScanIndexForward: true + Limit: N/2 进行查询,另一个人将使用 ScanIndexForward: false + Limit: N/2 进行查询。思路是从两端向中间查询相同的数据。

并行执行此操作,然后将两个响应合并为一个。 但是,这可能会将延迟从 300 毫秒减少到 150 毫秒,这仍然不小于 10 毫秒。

  1. 使用 DAX - DynamoDB Caching Layer
  2. 如果您的 1 MB 数据分布在数千个项目中,请考虑使用更少的项目,但每个项目本身将包含更多数据。
  3. 考虑使用像 brotli 这样的压缩算法来压缩您存储在 1 个 DynamoDB 项目中的数据。一旦我用这种方法成功了。根据格式的不同,它可以轻松地将数据大小减少 4 倍,这意味着查询时间快了约 4 倍!使用项目 #1 中描述的方法可以快 8 倍。

另外,请注意,不断从数据库中读取 1 MB 的数据会产生巨大的成本。