我想知道为什么我的 Amazon Kinesis Data Streams 会节流。
简短描述
即使您的指标在 Kinesis Data Streams 配额范围内,您的流也可能会因以下原因而节流:
- 您会收到 ProvisionedThroughputExceededException 或 LimitExceededException 错误代码。有关更多信息,请参阅 API 极限。
- 会针对您的流关闭 Kinesis 流增强监控。
- Amazon CloudWatch 指标中会有隐藏的微观峰值。
- 您的 CloudWatch 指标仅报告成功的操作,不含失败的操作。
解决方法
您会收到“ProvisionedThroughputExceededException”或“LimitExceededException”错误代码
当您使用 GetRecords 或 PutRecords API 时,您的流可能会产生 ProvisionedThroughputExceededException 或 LimitExceededException 节流错误。
以下情况也可能会导致这些错误:
- 写入 Kinesis 流的记录数量超过了流配额。
- 记录的大小(包括分区键)超过了 1 MB。
- 总吞吐量(以字节为单位)超过了 Kinesis 流限制。
- 生产者发出了过多的快速请求来写入流。通常会以“减速”或“超出速率”错误来表示此问题。
您也可以取一分钟数据点的值,然后将其除以 60。这样可为您提供每秒的平均值,以帮助您确定在特定的时间段内是否出现节流。如果成功的计数未超过配额,则要将 IncomingRecords 指标与 WriteProvisionedThroughputExceeded 指标相加,然后重新尝试进行计算。IncomingRecords 指标表示成功或接受的记录。WriteProvisionedThroughputExceeded 指标表示节流了多少记录。
**注意:**查看从生产者发送的记录的大小和数量。如果传入记录和节流记录的总和大于流配额,则要更改记录的大小或数量。
PutRecord 或 PutRecord.Success 指标还会显示失败的操作。当成功指标下降时,请查看数据生产者日志,以找到失败的根本原因。如果出现节流,则要在数据生产者端建立日志记录,以确定提交记录的总数和大小。如果 PutRecord.Success 或 PutRecords.Success 指标中的记录总数超过流配额,那么您的 Kinesis 流会节流。
会针对您的流关闭 Kinesis 流增强监控
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请参阅 Troubleshoot AWS CLI errors。此外,确保您使用的是最新版本的 AWS CLI。
您的 Kinesis 流中的某些分片接收的记录可能会比其他分片多。当分布不均时,可能会出现节流错误并导致热分片。热分片表示在 PUT 操作中使用的分区键没有在 Kinesis 流中的分片之间平均分配记录。
如果您关闭增强监控,则指标中可能会隐藏热分片,因为会汇总所有分片中的流指标。在您关闭增强流监控后,无法单独检查任何流。要对每个分片检查流,请运行 enable-enhanced-monitoring 命令。
您还可以比较 IncomingBytes 的平均值和最大值,以验证您的流中是否有热分片。当开启增强监控时,您还可以看到偏离平均值的分片。有关更多信息,请参阅 Strategies for resharding。
使用随机分区键
如果您的 Kinesis 流中有热分片,则要使用随机分区键对记录进行分组。如果操作已经使用随机分区键,则要调整该键以更正分配。然后,监控此键的指标是否有变化,例如 IncomingBytes 和 IncomingRecords。如果最大值和平均值模式接近,则没有热分片。
CloudWatch 指标中会有隐藏的微观峰值
要识别超出流配额的微观峰值或指标,请记录全部记录或自定义代码,以统计流的数量并查看记录大小。然后,评估发送到 Kinesis 流的记录的数量和大小,以确定超出数据配额的任何峰值。
Kinesis Data Streams 配额是按分片和按秒确定的。当在 CloudWatch 中总计 60 秒时间限制的值时,可能会出现超出 Kinesis Data Streams 配额的微观峰值。此外,一分钟内的记录总数可能会看起来很低,因为会总计 60 秒钟的指标。但是,这一分钟内任何一秒的记录会体现更高的数字。流量可能会显示低于流配额,但是在那一秒钟内被节流的分片会显示为对流节流。
如果 CloudWatch 指标未显示配额异常或数据中的微观峰值,请完成以下任务:
您的 CloudWatch 指标仅报告成功的操作,不含失败的操作
Kinesis 指标仅记录对流的成功操作。Kinesis 流可能不包含被节流的操作。然后会超过流配额,但指标不显示异常。
当失败的记录无法进入 Kinesis 流时,则会节流。如果生产者中有重试行为,则会再次尝试失败的记录。然后,此过程可能会延迟。
要确认是否向 Kinesis 流发送了过多的记录,请将传入记录总数与节流的记录数量相加。
相关信息
Developing custom consumers with dedicated throughput (enhanced fan-out)
Monitoring the Amazon Kinesis Data Streams Service with Amazon CloudWatch
disable-enhanced-monitoring