通过查询最大 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 的数据本身就是一项具有挑战性的任务。
以下是您可以尝试的方法:
- 将您的读取操作一分为二。
一个人将使用 ScanIndexForward: true
+ Limit: N/2
进行查询,另一个人将使用 ScanIndexForward: false
+ Limit: N/2
进行查询。思路是从两端向中间查询相同的数据。
并行执行此操作,然后将两个响应合并为一个。
但是,这可能会将延迟从 300 毫秒减少到 150 毫秒,这仍然不小于 10 毫秒。
- 使用 DAX - DynamoDB Caching Layer
- 如果您的 1 MB 数据分布在数千个项目中,请考虑使用更少的项目,但每个项目本身将包含更多数据。
- 考虑使用像 brotli 这样的压缩算法来压缩您存储在 1 个 DynamoDB 项目中的数据。一旦我用这种方法成功了。根据格式的不同,它可以轻松地将数据大小减少 4 倍,这意味着查询时间快了约 4 倍!使用项目 #1 中描述的方法可以快 8 倍。
另外,请注意,不断从数据库中读取 1 MB 的数据会产生巨大的成本。
我正在使用 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 的数据本身就是一项具有挑战性的任务。
以下是您可以尝试的方法:
- 将您的读取操作一分为二。
一个人将使用 ScanIndexForward: true
+ Limit: N/2
进行查询,另一个人将使用 ScanIndexForward: false
+ Limit: N/2
进行查询。思路是从两端向中间查询相同的数据。
并行执行此操作,然后将两个响应合并为一个。 但是,这可能会将延迟从 300 毫秒减少到 150 毫秒,这仍然不小于 10 毫秒。
- 使用 DAX - DynamoDB Caching Layer
- 如果您的 1 MB 数据分布在数千个项目中,请考虑使用更少的项目,但每个项目本身将包含更多数据。
- 考虑使用像 brotli 这样的压缩算法来压缩您存储在 1 个 DynamoDB 项目中的数据。一旦我用这种方法成功了。根据格式的不同,它可以轻松地将数据大小减少 4 倍,这意味着查询时间快了约 4 倍!使用项目 #1 中描述的方法可以快 8 倍。
另外,请注意,不断从数据库中读取 1 MB 的数据会产生巨大的成本。