为什么我会遇到 Kinesis Data Streams 延迟高的问题?

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

我的 Amazon Kinesis 数据流在获取数据记录时延迟较高。为什么会发生这种情况?如何排查此问题?

简短描述

如果每个 GET 请求的记录数或记录大小增加,则 GetRecords.Latency 的值可能会增加。如果您在创建器向流中提取数据时尝试重启应用程序,则可能会积累没有被使用的记录。随着要获取的记录数或数据量增加,GetRecords.Latency 的值也会增加。此外,如果应用程序不能匹配数据的提取速度,则 IteratorAge 的值将会增加。

注意:在 Kinesis 数据流中启用服务器端加密也会增加延迟。

解决方法

利用 Amazon CloudWatch 监控 Amazon Kinesis Data Streams 服务。检查 GetRecords.Latency 等 CloudWatch 指标以验证延迟是否在持续增加。如果延迟持续增加,则检查 CloudWatch 中 IncomingRecordsIncomingBytesGetRecords.RecordsGetRecords.Bytes 等指标的值是否也在增加。随着数据量增加,这些指标也会增加,进而导致高延迟。这是因为 Kinesis 数据流中可用的记录越多,GetRecords 提取的记录也越多。

如果 IteratorAge 的值也同样增加,则可能表明放入流中的 IncomingBytes 在增加。检查 CloudWatch 中的 IncomingBytes 指标以验证字节数是否在增加。您还可以检查对流的 GetRecords 调用是否在减少。传入的字节数越多,每个 GetRecords 调用检索的数据越多,这会增加 GetRecords.Latency 的值。

如果 IncomingBytesIncomingRecords 的值并未增加,但您仍然观察到高延迟,则可能是传入的数据过多。如果使用者应用程序无法匹配数据传入的速度,则 Kinesis 数据流中的数据将会持续积累。即使您重新启动应用程序,每个 GetRecords 调用中获取的记录数也会增加。记录数或每个 GetRecords 调用获取的数据量增加,会导致 GetRecords.Latency 的值增加。

要解决此错误,请尝试以下问题排查方法:

  • 检查您的应用程序,以确定是否发出了足够的 GetRecords 调用来处理传入的数据量。如果使用者是 Amazon Kinesis Client Library (KCL) 应用程序或 AWS Lambda,则增加流中的分片数量。分片数的增加会增加传输流的使用速率,同时降低 IteratorAgeGetRecords.Latency 的值。
  • 增加 Kinesis 数据流的保留期以避免任何数据丢失。较长的保留期可帮助您的应用程序处理积压的数据。
  • 如果您有自己的使用者应用程序,则检查处理逻辑和记录处理时间。
  • 检查系统的中央处理器 (CPU) 和内存利用率,以确定您是否需要释放更多内存。

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?