如何排查 DynamoDB 表的高延迟问题?

上次更新时间:2020 年 6 月 16 日

我的 Amazon DynamoDB 请求的响应时间增加。为什么会出现这种情况,我该怎样解决呢?

解决方法

分析 Amazon CloudWatch 指标 SuccessfulRequestLatency 时,最佳实践是检查平均延迟。偶尔发生的延迟激增不需要担心。但是,如果平均延迟较高,则可能存在需要解决的底层问题。

要获取所有 DynamoDB 调用的延迟值,请启用 AWS 开发工具包的延迟指标日志记录。这些指标可帮助您确定延迟增加的根源。请记住,DynamoDB 延迟指标只能衡量 DynamoDB 或 Amazon DynamoDB 流内的活动。该延迟指标没有考虑网络延迟或客户端活动。

注意:对于大多数原子操作,例如 GetItemPutItem,平均延迟预计为个位毫秒数。 非原子操作(例如 QueryScan)的延迟取决于很多因素,其中包括结果集的大小及查询条件和筛选条件的复杂性。

考虑通过以下一个或多个策略来减少延迟:

  • 减少请求超时设置:将客户端开发工具包参数 requestTimeOutclientExecutionTimeout 调优为超时,将更快出现失败(例如,50 ms 之后)。这会导致客户端在指定的时间段后放弃高延迟请求,然后发送另一个请求,该请求通常比第一个请求更快完成。有关超时设置的更多信息,请参阅为延迟感知 Amazon DynamoDB 应用程序调优 AWS Java 开发工具包 HTTP 请求设置
  • 减少客户端与 DynamoDB 终端节点之间的距离:如果您已经全局分散用户,请考虑使用全局表。使用全局表,您可以指定想要要在其中提供表的 AWS 区域。这样可以显著减少用户的延迟。
  • 使用缓存:如果您的流量大量用于读取操作,请考虑使用缓存服务,例如 DynamoDB Accelerator (DAX)。DAX 是适用于 DynamoDB 的完全托管、高度可用的内存中缓存,将性能提升了多达 10 倍,从毫秒级提升到微秒级,甚至在每秒进行数百万个请求时。
  • 发送持续流量或重复使用连接:当您没有进行请求时,考虑让客户端将虚假流量发送到 DynamoDB 表中。或者,您可以重复使用客户端连接或使用连接池。所有这些技术都能保持内部缓存处于预热状态,从而帮助保持低延迟。
  • 使用最终一致性读取:如果您的应用程序不需要强一致性读取,请考虑使用最终一致性读取。最终一致性读取更便宜,发生高延迟的可能性更低。有关更多信息,请参阅读取一致性

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?