Kafka消息分区始终为0且手动指定分区时报元数据获取超时问题
问题原因排查与解决方案
1 所有消息始终进入分区0的常见原因
- 核心高发原因:
topic1的实际分区数为1。Kafka分区编号从0开始计数,若只有1个分区,所有消息无论是否设置key,都只能写入分区0,完全符合你观测到的现象。如果你的集群开启了自动创建topic功能,默认创建的topic分区数由服务端num.partitions参数控制,默认值为1,大概率就是问题根因。 - 若确认分区数大于1,排查以下两点:
- 测试代码key固定:你现有测试代码里写死了消息key为
zxcvb,默认分区器会对key做哈希后对分区数取模,固定key计算出的分区结果也固定,换不同key测试即可验证。 - 分区器配置异常:检查项目Kafka配置中是否自定义了固定返回0的分区器实现,覆盖了默认的
DefaultPartitioner逻辑。
- 测试代码key固定:你现有测试代码里写死了消息key为
2 手动指定分区发送报错的原因
报错Topic topic1 not present in metadata after 60000 ms在你这个场景下,本质是你指定的分区(2、3)在topic1中不存在。Kafka获取集群元数据后发现目标topic没有对应编号的分区,就会抛出该超时类错误,和topic本身不存在的报错逻辑一致。
验证与修复步骤
- 执行Kafka自带命令查询topic详情,确认实际分区数:
kafka-topics.sh --describe --topic topic1 --bootstrap-server <你的Kafka集群地址:端口>
- 若分区数小于4(你用到了0、2、3三个分区,至少需要4个分区编号0~3),删除旧topic后重新创建:
# 删除旧topic(请确认无重要数据) kafka-topics.sh --delete --topic topic1 --bootstrap-server <你的Kafka集群地址:端口> # 新建带4个分区的topic,单节点集群replication-factor设为1,多节点可按需设置为2或3 kafka-topics.sh --create --topic topic1 --bootstrap-server <你的Kafka集群地址:端口> --partitions 4 --replication-factor 1
- 若分区数符合要求,修改测试代码使用动态key重试:
public void testKafka() throws InterruptedException { for (int i = 0; i < 1000; i++) { // 把i作为key,保证哈希值不同 kafkaTemplate.send("topic1",String.valueOf(i), String.valueOf(i)); } Thread.sleep(1000 * 60); }
内容的提问来源于stack exchange,提问作者Gas
相关产品推荐
相关产品推荐

