AWS國際開戶 AWS Kinesis Data Streams 數據滯後(GetRecords.IteratorAgeMilliseconds 飙升)診斷
一、先看懂这个指标到底在说什么
GetRecords.IteratorAgeMilliseconds 飙升,通常不是 Kinesis 自己“坏了”,而是消费端正在追赶历史数据。这个指标表示:当前消费者拉取到的数据,距离流里最新数据已经过去了多少毫秒。数字越大,说明你读到的内容越旧,积压越明显。
很多人一看到这个值上涨,就直接去怀疑网络、AWS 故障,甚至马上扩 shard。其实更常见的情况是:消费者处理不过来,或者某个 shard 的流量明显偏高,导致读取速度跟不上写入速度。换句话说,问题大多出在“读”和“处理”,而不是“存”。
要特别注意,IteratorAgeMilliseconds 高,并不一定代表所有 shard 都有问题。它可能只集中在少数热点 shard,也可能是某个下游系统卡住后,把整个消费链路拖慢了。先看清现象,再谈处理,效率会高很多。
二、先区分:是短暂波动,还是持续滞后
1. 短暂波动通常可以观察
如果指标只是短时间抬升,随后很快回落,往往是突发流量、批处理窗口、下游抖动造成的。比如白天业务高峰时积压一点,夜间消费又追了回来,这种情况不一定需要立刻扩容。
2. 持续上涨就要立即排查
如果这个值持续升高,且长时间不回落,说明消费端已经进入稳定的“追不上”状态。此时再拖下去,可能出现数据延迟放大、告警风暴、实时任务失效,严重时还会触发数据保留期限压力。
判断是否严重,最直接的方法是同时看三个东西:流入速率、消费速率、滞后曲线。如果写入一直稳定,消费却明显偏低,且滞后持续增长,基本就能确认是消费能力不足。
三、最常见的几类根因
1. 消费逻辑太重,单次处理耗时过长
这是最常见的原因。消费者虽然成功拉到了数据,但后续要做复杂解析、调用外部接口、写数据库、做聚合计算,结果处理时间远超预期。Kinesis 读得不慢,慢的是你自己的业务逻辑。
尤其要警惕同步调用下游系统。只要其中一个外部服务变慢,整个消费线程就会被卡住。很多团队会误以为是 Kinesis 读取瓶颈,实际上瓶颈在数据库、API 网关或消息派发的后半段。
2. shard 负载不均,出现热点分布
Kinesis 的吞吐是按 shard 计算的。如果 partition key 设计不合理,少数 key 会集中打到某几个 shard 上,形成热点。表面上看全流量并不大,但热点 shard 已经被写满或读满,IteratorAgeMilliseconds 就会在这些 shard 上快速拉高。
热点问题的典型特征是:某些 shard 的滞后很高,另一些却很空闲。这个时候单纯增加消费者数量往往效果有限,因为真正的瓶颈不是总量,而是分布不均。
3. 消费端并发不足
如果只有一个线程、一个任务、一个 Lambda 并发实例在读流,那么再大的流也会被拖慢。Kinesis 是天然适合并行消费的服务,若你的读取方式过于串行,滞后几乎是必然结果。
有些团队在上线初期为了稳妥,把轮询间隔设得很长,batch size 也很小,结果每次只拿一点点数据,还要频繁等待。看似温和,实际吞吐非常差。
4. 下游写入成为瓶颈
消费者读到数据后,若要写入 RDS、OpenSearch、Redshift、S3 或其他系统,就要看下游是否稳得住。下游一旦出现限流、锁竞争、连接池耗尽,消费者就会被迫重试、等待,最终把积压转回到 Kinesis 侧。
这种情况很容易产生误判。你看到的是 IteratorAgeMilliseconds 上升,真正出问题的可能是数据库慢查询、表锁、磁盘 IO 不足,或者对象存储上传失败后反复重试。
5. 批量太小,轮询太频繁
如果每次 GetRecords 只拿很少的数据,却还频繁轮询,就会浪费大量请求时间在空转上。尤其在数据量上来之后,这种方式既浪费 API 配额,也降低有效吞吐。Kinesis 不是越“勤快”越好,关键是每次抓取后能不能高效处理。
6. 恢复阶段积压未被追平
有时问题并不是当前消费速度太慢,而是前面已经积压了太久。比如消费者重启、部署中断、下游故障、临时限流,都会让 backlog 突然堆起来。即使恢复后系统恢复正常,也需要一段时间消化旧数据,这段时间 IteratorAgeMilliseconds 仍然会偏高。
四、诊断时应该盯哪些指标
1. 先看流本身的写入压力
重点关注每个 shard 的写入速率、IncomingBytes、IncomingRecords 以及是否有写入限流迹象。若写入端明显超过预期,或者分布极不均匀,就要先怀疑 partition key 和热点问题。
2. 再看读取侧是否真正吃满
除了 IteratorAgeMilliseconds,还要看 GetRecords.Records、GetRecords.Bytes、GetRecords.Success、GetRecords.ThrottledRecords 之类的指标。如果读取吞吐很低,或者频繁被限流,说明问题已经发生在消费层或账户配额层。
AWS國際開戶 3. 最后看消费者应用本身
消费者机器的 CPU、内存、GC、网络延迟、线程池队列长度、重试次数,都能帮助定位问题。很多时候,Kinesis 指标只是“报警器”,真正的故障点藏在应用日志和运行时状态里。
如果你使用的是 Lambda 作为消费者,还要额外查看函数执行时长、错误率、并发数、超时次数、重试次数,以及每个批次的处理耗时。Lambda 场景里,批处理大小和并发配置稍有不当,就会让滞后迅速放大。
五、一个实用的排障顺序
- 确认滞后是单 shard 还是全局性问题。
- 查看写入流量,判断是否有热点 key 或突发峰值。
- 查看消费端处理耗时,确认是不是业务逻辑拖慢了读取。
- 检查下游系统是否限流、超时或写入失败。
- 确认消费并发是否足够,是否存在单线程瓶颈。
- 再决定要不要扩 shard、改 key、拆任务或加并发。
这个顺序很重要。很多人习惯从“加机器”开始,结果钱花了,问题还在。先定位,再优化,通常比盲目扩容有效得多。
六、对应不同根因,怎么处理最有效
1. 处理逻辑太重,就先减负
能异步的不要同步,能批处理的不要逐条写库,能缓存的不要每条都查外部接口。把重计算、慢 IO、第三方调用尽量从主消费路径里拆出去。消费链路越短,滞后越容易控制。
2. 并发不足,就增加水平处理能力
可以增加消费实例数,或提高 Lambda 并发能力;如果是 KCL 消费者,确保 lease 分配和 worker 数量匹配。前提是 shard 本身支持这样的并行度,否则单纯加消费者只会增加空转竞争。
AWS國際開戶 3. shard 热点明显,就优化 partition key
如果某些 key 永远高频出现,考虑加随机后缀、做 key 分片,或者重新设计分区维度。好的 partition key 应该尽量均匀分散,不要让少数实体长期霸占同一个 shard。
4. 总吞吐不够,就考虑扩 shard
AWS國際開戶 当流量整体上升,而消费者和处理逻辑都已经做过优化后,扩 shard 才是正解。扩容不是为了掩盖问题,而是为了让系统有足够的物理承载能力。要记住,Kinesis 的吞吐天花板本来就是按 shard 线性增长的。
5. 下游慢,就把写入链路做隔离
可将数据先落到缓冲层,再由独立任务写入最终存储;也可以把失败重试和主消费路径拆开,避免一个坏批次阻塞整个流。对慢数据库,尤其要控制事务大小、批量大小和连接池配置。
6. 有“毒数据”或坏消息,就单独隔离
有些批次一进入处理就报错,导致重复重试、回滚、卡死。此时要把坏消息快速分流到死信队列或隔离区,避免一条脏数据拖垮整条流。生产环境里,稳定性往往比完美处理更重要。
七、Lambda 消费场景下的额外注意点
如果 Kinesis 的消费方是 Lambda,IteratorAgeMilliseconds 飙升时,常见的原因不是 Lambda 没被触发,而是触发后处理太慢。要重点看每批次的大小、函数超时、并发限制,以及 batch 失败后的重试策略。
Lambda 场景里,几个小改动常常非常有效:适当调大 batch size、提高内存以换取更强 CPU、增加 parallelization factor、缩短单批处理时间、减少对外部系统的同步依赖。只要单批耗时下降,整体 lag 往往会明显改善。
AWS國際開戶 但也不要盲目把 batch 拉得过大。批次越大,单次失败影响越大,重试成本越高。理想状态不是无限加大,而是在吞吐、延迟和失败恢复之间找到平衡。
八、一个容易忽略的现实问题:恢复速度要快于积压增长速度
很多团队只关心“现在是不是在慢慢追”,却忽略了“追的速度有没有超过新数据进入的速度”。只要新流量持续进入,而消费能力始终略低于写入速度,滞后就会像滚雪球一样越来越大。
所以排障时不要只看某一时刻的耗时,要看趋势。今天能处理 1000 条,明天高峰来了 1500 条,如果系统没有足够余量,迟早还会再次积压。真正稳定的系统,不是刚好够用,而是能留出安全边际。
九、把这类问题做成日常监控,而不是事后救火
最有价值的做法,是把 IteratorAgeMilliseconds 和几个关键辅助指标一起做成告警链路。比如滞后超过阈值时,自动看 shard 热点、消费失败率、下游超时率和批次处理时间。这样你看到的就不只是一个报警,而是一组可解释的信号。
另外,建议把流量峰值、消费者处理时长、下游写入延迟做成同屏看板。一次事故之后,很多团队才会发现问题其实早有征兆,只是平时没有把这些指标放在一起看。
十、结语:先找瓶颈,再谈扩容
GetRecords.IteratorAgeMilliseconds 飙升,本质上是“数据已经到达,但你还没来得及处理完”的信号。它提醒你的不是某一个单点故障,而是整条消费链路的吞吐是否匹配业务增长。
排查这类问题,最重要的是不要急着下结论。先区分是热点、并发不足、处理过慢,还是下游拖累;再结合 shard 负载、消费耗时和错误率做判断。只要方法对了,绝大多数 Kinesis 滞后问题都能很快定位,并且通过改 key、提并发、减处理、拆链路、扩 shard 得到有效解决。
真正可靠的流式系统,不是永远没有滞后,而是当滞后出现时,你能迅速知道它为什么发生、会影响到哪里、又该从哪一步开始修复。

