中间件-02-Kafka集群测试与稳定性验证思路

第一次做 Kafka 测试,最容易停留在两个动作上:

  • 生产一批消息,看消费端能不能收到
  • 压一轮吞吐,看每秒能跑多少条

这类验证能说明 Kafka 基本可用,但离“集群稳定性验证”还差得很远。真正会在测试环境、回归环境和发布现场暴露风险的,通常不是单次收发,而是这些问题:

  • 某个 Broker 重启后,消费延迟为什么一直降不下来
  • Topic 分区明明都在,生产端还是持续报超时
  • 消费组没有掉线,但业务处理已经明显积压
  • 同样的压测模型,白天稳定,晚上就频繁抖动
  • 看起来是 Kafka 变慢,最后根因却在磁盘、网络或消息模型本身

这说明 Kafka 集群测试不能只看“能不能收发消息”,而要把验证对象拆开:

  • 集群层是否稳定
  • Topic 和分区设计是否合理
  • 生产链路是否可控
  • 消费链路是否能承受积压和恢复
  • 故障、切换、回放和重平衡是否会把业务拖垮

这篇文章不讲空泛的组件原理,只讲 Kafka 集群测试与稳定性验证里最值得长期沉淀的几件事:

  • 验证对象怎么分层
  • 最小执行骨架怎么落
  • 稳定性验证重点看哪些现象和指标
  • 常见坑怎么发现、怎么排查、怎么修复

一、Kafka 集群验证更适合拆成五层,不要只测吞吐

Kafka 场景最容易失真的地方,是把所有问题都压成“吞吐不够”。

更适合测试现场的做法,是先按下面五层拆验证对象:

  • 集群可用层
  • Topic 与分区层
  • 生产链路层
  • 消费链路层
  • 故障与恢复层

这样拆的价值在于,问题出现时可以更快回答:

  • 是集群本身不稳,还是 Topic 设计不合理
  • 是生产端写不进去,还是消费端跟不上
  • 是业务处理慢,还是 Kafka 自身在退化
  • 是短时波动,还是恢复链路本身有缺陷

1. 集群可用层:先确认 Kafka 本身是不是稳的

这一层重点不是看 Broker 进程有没有启动,而是确认集群是否具备稳定承载能力:

  • Broker 是否都在集群中
  • Controller 是否稳定
  • ISR 是否健康
  • 副本同步是否持续波动
  • 磁盘、网络、连接数是否接近风险边界

如果这一层不稳,后面的压测和业务验证都会被带偏。

例如:

  • Broker 都在线,但某个节点磁盘持续高水位
  • Topic 正常存在,但副本长期跟不上
  • Controller 频繁切换,导致集群一直处于抖动状态

这些现象单看“服务是否活着”并不会暴露,但会直接影响业务消息流。

2. Topic 与分区层:不要把消息模型问题误判成 Kafka 性能问题

很多 Kafka 场景里的瓶颈,并不是 Broker 扛不住,而是 Topic 和分区设计先出问题:

  • 分区数过少,天然把并发打死
  • 分区数过多,导致控制面和刷盘压力上升
  • Key 设计不合理,热点分区被打爆
  • 副本数和 acks 配置不匹配,导致吞吐和可靠性都失控

这一层更值得验证的不是“建 Topic 成功”,而是:

  • 分区数能否支撑目标并发
  • 副本策略是否符合环境可靠性目标
  • 分区热点是否在预期范围内
  • 保留策略、压缩策略、清理策略是否和业务匹配

3. 生产链路层:确认写入是否稳定,而不是只看成功率

生产端验证至少要拆成四类:

  • 写入成功率
  • 写入耗时
  • 重试与超时
  • 批量与压缩参数对集群的影响

如果只看“发送有没有成功”,通常会漏掉两类风险:

  • 成功率很高,但尾延迟已经明显拉长
  • 重试掩盖了底层抖动,业务侧还以为链路稳定

生产链路更适合重点看:

  • 平均延迟和 P95/P99
  • request timeoutrecord errorretry 次数
  • 每个 Broker 的流量分布
  • 批大小、压缩方式、刷盘节奏对延迟的影响

4. 消费链路层:很多稳定性问题其实在消费端才开始暴露

Kafka 场景里一个常见误判是:

  • 生产速度上去了,就以为集群稳定

但业务真正被拖垮的,往往是消费端:

  • 消费速率赶不上生产速率,堆积不断扩大
  • Rebalance 频繁发生,业务处理线程被打断
  • 消费端实例都在线,但业务处理逻辑已经阻塞
  • Offset 持续提交,但真实业务还没处理完

这一层更值得盯的是:

  • 消费延迟
  • Lag 增长速度
  • Rebalance 次数
  • 消费异常重试
  • 业务处理耗时与 Kafka 拉取耗时的拆分

5. 故障与恢复层:真正的稳定性测试,要看退化和恢复

只测正常路径,很难说明 Kafka 集群是否真的稳定。

更适合长期维护的稳定性验证,至少要补下面几类场景:

  • 单 Broker 重启
  • Broker 短时不可达
  • 磁盘写入变慢
  • 网络抖动
  • 消费组扩缩容
  • Topic 分区重新分配
  • 下游处理能力下降导致堆积

这一层最关键的问题不是“有没有故障”,而是:

  • 故障发生后,业务能不能继续跑
  • 故障恢复后,Lag 能不能收敛
  • 重平衡期间会不会放大超时和积压
  • 恢复动作会不会引入新的数据重复和顺序问题

二、Kafka 集群测试更适合先做一套最小执行骨架

如果要把 Kafka 测试做成可重复执行的方案,第一版不需要上来就覆盖所有 Topic。

更适合先收出下面这套最小执行骨架:

  1. 集群基线确认
  2. Topic 与参数确认
  3. 生产基线验证
  4. 消费基线验证
  5. 稳定性压测
  6. 故障与恢复验证
  7. 证据收集与结论输出

1. 集群基线确认

执行前先固定做这组检查:

  • Broker 列表与节点角色
  • Controller 状态
  • Topic 分区数、副本数
  • ISR 状态
  • 磁盘、CPU、网络、文件句柄
  • 历史积压和遗留 Topic 干扰

这一步的目的,是先排除“带病开测”。

2. Topic 与参数确认

在压测和验证前,至少把下面几项记清楚:

  • Topic 名称、用途、分区数、副本数
  • Producer 的 acksbatch.sizelinger.ms、压缩方式
  • Consumer 的并发数、批量拉取参数、提交策略
  • 保留时间、清理策略、消息体大小

这组记录不能省。后面一旦出现“同样模型跑出来两套结论”,通常就是这里的参数没对齐。

3. 生产基线验证

先用较小流量跑生产链路,确认基础写入稳定:

  • 单生产者低并发
  • 多生产者均匀写入
  • 大消息与小消息对比
  • 不同 acks 策略对比

这一阶段重点不是压极限,而是建立基线:

  • 正常情况下的发送延迟是多少
  • 哪种参数组合最容易引入重试
  • 热点分区是否已经出现

4. 消费基线验证

消费侧也要先跑基线,不要等大流量上来后才看:

  • 单消费组单实例
  • 单消费组多实例
  • 多消费组并行消费
  • 业务处理慢速场景

这里要把 Kafka 拉取和业务处理拆开记录,否则很容易把业务处理慢误判成 Kafka 消费慢。

5. 稳定性压测

稳定性压测不适合只打一轮峰值,更适合按阶段走:

  • 低压稳定段
  • 逐步升压段
  • 持续运行段
  • 降载恢复段

每个阶段都要记录:

  • 生产速率
  • 消费速率
  • Lag 变化
  • Broker 资源变化
  • 延迟分位数
  • 异常次数

6. 故障与恢复验证

至少补下面几类故障动作:

  • 重启单个 Broker
  • 下线一个消费实例
  • 短时拉高磁盘 IO
  • 模拟网络抖动
  • 扩容消费组

每做一个动作,都要回答三件事:

  • 业务是否感知到中断
  • Lag 是否可收敛
  • 恢复后是否留下重复消费、消息乱序或积压尾巴

7. 证据收集与结论输出

Kafka 测试最容易失败的不是执行,而是最后给不出能落地的结论。

每轮至少要收这些证据:

  • Topic 与集群参数快照
  • Producer / Consumer 核心参数
  • Broker 关键指标时间窗
  • Lag 曲线
  • 故障动作时间点
  • 业务成功率、超时率、重试率

三、稳定性验证时最值得长期看的指标,不只是吞吐

Kafka 集群验证里,下面几类指标更适合长期追踪。

层级 指标 关注点 常见误判
集群层 Broker 在线状态、Controller 稳定性、ISR 变化 集群是否在持续抖动 节点在线就等于集群稳定
分区层 分区流量分布、热点分区、分区重分配耗时 分区设计是否合理 把热点问题当成 Kafka 性能问题
生产层 发送成功率、发送延迟、重试次数、超时次数 生产链路是否开始退化 成功率高就代表没有风险
消费层 消费速率、Lag、Rebalance 次数、提交耗时 消费能否跟上并快速恢复 Offset 在提交就等于业务处理成功
资源层 CPU、磁盘写入、网络吞吐、连接数、页缓存 Broker 是否接近资源瓶颈 只看 CPU,不看磁盘和网络
业务层 订单积压、任务超时、下游回写延迟 Kafka 抖动是否已经传导到业务 只盯中间件指标,不看业务后果

这里有一个很关键的判断原则:

Kafka 测试最终要回答的是业务是否还能稳定消费和恢复,而不是只回答 Broker 还能跑多快。

四、Kafka 场景里更容易踩的坑,通常不是“配置没写对”这么简单

1. 把分区数当成越多越好

分区数太少会限制并发,分区数太多会带来控制面和资源压力。

如何发现:

  • Broker 元数据操作变慢
  • Topic 数和分区数上来后,控制面波动变大
  • 小流量也出现高管理开销

如何修复:

  • 按实际吞吐目标和消费者并发重新评估分区数
  • 热点 Topic 单独治理,不要全局一刀切加分区

如何避免再次发生:

  • 每个核心 Topic 建立容量基线,不要凭感觉定分区

2. 把 Lag 增长全部归因给 Kafka

很多场景里 Lag 上涨,并不是 Broker 撑不住,而是:

  • 消费业务处理慢
  • 下游数据库写入卡住
  • 消费者线程模型不合理

如何发现:

  • Kafka 拉取延迟不高,但业务处理耗时明显升高
  • Consumer 进程活着,业务线程已经被堵住

如何修复:

  • 把 Kafka 拉取链路和业务处理链路分开监控
  • 对慢处理逻辑做隔离、降级或异步化

3. 只测正常写入,不测恢复链路

很多系统在正常情况下表现稳定,但一旦:

  • Broker 重启
  • 消费组扩容
  • 网络抖动

就会暴露:

  • Rebalance 时间过长
  • Lag 回落过慢
  • 业务侧重试风暴

如何避免:

  • 把故障与恢复动作纳入常规验证,不要只在事故后补测

4. 把业务重复消费问题全算到 Kafka 身上

重复消费有时是 Kafka 语义带来的边界问题,有时是业务端提交时机、幂等设计和重试策略本身不稳。

如何发现:

  • Offset 提交时点和业务落库时点不一致
  • 业务重试逻辑和 Kafka 重试逻辑叠加

如何修复:

  • 明确业务侧幂等键
  • 把消息确认点与业务完成点对齐

五、真实案例:看起来像 Kafka 集群扛不住,最后根因并不在 Broker

场景

某次测试环境回归中,订单链路从上午开始出现明显积压。平台侧最直观的现象是:

  • Producer 发送还在成功
  • Consumer 组在线
  • 业务侧超时快速上升
  • Kafka Lag 在 20 分钟内持续扩大

现场最先怀疑的是 Kafka 集群不稳,因为当天刚做过 Topic 扩容和一轮回归升压。

执行

现场按既定骨架先做四组确认:

  1. 看集群层:
    • Broker 是否在线
    • Controller 是否频繁切换
    • ISR 是否掉队
  2. 看生产层:
    • Producer 延迟和重试是否明显恶化
  3. 看消费层:
    • Lag 增长速度
    • Rebalance 是否频繁发生
  4. 看业务处理层:
    • 消费线程是否真的在处理
    • 下游数据库和缓存是否有异常

现象

排查过程中发现几个关键事实:

  • Broker 全部在线,Controller 稳定,没有明显 ISR 波动
  • Producer 成功率很高,发送延迟只有轻微抬升
  • Kafka 消费端拉取速率并不低,但业务处理耗时突然拉长
  • 下游 MySQL 出现锁等待和慢 SQL,导致消费业务线程卡住
  • Consumer 进程仍然存活,所以监控最初看起来像“消费没问题”

排查

后续把时间窗对齐后,顺序变得很清楚:

  1. 先出现的是下游数据库慢写
  2. 然后业务处理线程被拖慢
  3. 然后消费速率开始落后于生产速率
  4. 然后 Lag 快速放大
  5. 最后平台侧才开始看到订单超时和回写延迟

也就是说,Kafka 只是最先把积压放大出来的一层,不是根因所在。

修复

现场最终做了四个动作:

  • 先限流生产端,避免 Lag 继续扩大
  • 临时扩容消费实例,但不盲目继续加实例,避免加重数据库压力
  • 处理 MySQL 慢 SQL 和锁冲突
  • 补充消费链路拆分监控,把 Kafka 拉取耗时和业务处理耗时分开

修复后,Lag 在 40 分钟内逐步收敛,后续同类回归里也不再把“Lag 上涨”直接等价成“Kafka 集群有问题”。

六、Kafka 稳定性验证最后要交付的,不只是吞吐数字

一轮有价值的 Kafka 集群测试,最后更应该交付下面几类结论:

  • 目标吞吐下,当前 Topic 与分区模型是否合理
  • 目标并发下,Producer / Consumer 参数组合是否稳定
  • 关键业务链路在堆积、重平衡、故障恢复时是否还能收敛
  • 当前集群的资源边界和风险点在哪
  • 哪些问题属于 Kafka 集群本身,哪些问题来自业务模型和下游依赖

真正成熟的 Kafka 测试方法,不是把消息打进去再看监控,而是把集群层、消息层、消费层、业务层和恢复层串成一条证据链。这样一来,后续无论是发布验证、容量评估,还是事故排查,结论都会更稳,也更容易复用。