我想知道为什么我的 Amazon Kinesis 数据流在获取数据记录时延迟很高。
简短描述
如果每个 GET 请求的记录数或记录大小增加,GetRecords.Latency 可能会增加。如果您在生产者向流中提取数据时重新启动应用程序,记录可能会累积而不会被消耗。随着记录数或要获取的数据量增加,GetRecords.Latency 的值也会增加。如果应用程序无法赶上提取速率,IteratorAge 会增加。
**注意:**在 Kinesis 数据流上启用服务器端加密会增加延迟。
解决方法
使用 Amazon CloudWatch 监控 Kinesis 数据流服务。查看 CloudWatch 指标(如 GetRecords.Latency),验证延迟是否持续增加。如果延迟持续增加,检查 CloudWatch 中的 IncomingRecords、IncomingBytes、GetRecords.Records 和 GetRecords.Bytes 指标是否也有所增加。随着数据量增加,这些指标会增加,导致高延迟。之所以出现这种增加,是因为当 Kinesis 数据流中有更多可用记录时,GetRecords 会提取更多记录。
如果您的 IteratorAge 也有所增加,可能会有更多 IncomingBytes 进入流。查看 CloudWatch 中的 IncomingBytes 指标,验证字节数是否增加。您可以检查对流的 GetRecords 调用是否减少。有更多传入字节表明,每次 GetRecords 调用都会检索更多数据,增加 GetRecords.Latency 值。
如果您继续观察到高延迟(即使 IncomingBytes 或 IncomingRecords 没有增加),说明可能有太多传入数据。如果使用者应用程序无法赶上传入数据,数据将继续在 Kinesis 数据流中累积。即使您重新启动应用程序,在每次 GetRecords 调用中也会获取更多记录。记录数或每次 GetRecords 调用获取的数据量增加,会导致 GetRecords.Latency 的值增加。
要解决此问题,请完成以下任务:
- 检查您的应用程序,看看是否进行了足够的 GetRecords 调用来处理传入的数据量。如果您作为消费者使用 Amazon Kinesis Client Library(KCL)应用程序或 AWS Lambda,则应增加数据流中的分片数量。分片数量增加会增加传输流的消耗率,并降低 IteratorAge 和 GetRecords.Latency 值。
- 应延长 Kinesis 数据流的保留期以避免任何数据丢失。较长的保留期可帮助您的应用程序处理积压的数据。
- 如果您有消费者应用程序,则检查处理逻辑并记录处理时间。
- 检查系统的中央处理单元(CPU)和内存利用率,看看是否需要释放更多内存。