注:该文用于个人学习记录和知识交流,如有不足,欢迎指点。
一、主题自动创建机制
1. auto.create.topics.enable
auto.create.topics.enable 是 Kafka Broker 端的全局配置 ,不属于生产者或消费者,因此不存在 "生产者默认开启、消费者默认关闭" 的说法。该配置的默认值在所有 Kafka 版本中均为 true(全局开启),生产者和消费者只是触发自动创建 Topic 的不同场景,最终是否创建完全由 Broker 端的这个开关决定。
| 维度 | 核心事实 |
|---|---|
| 配置归属 | 仅属于 Broker 端(server.properties 配置文件),生产者 / 消费者无此配置 |
| 默认值 | 所有 Kafka 版本(0.10+、2.x、3.x)均为 true(全局开启自动创建) |
| 生产者触发场景 | 向不存在的 Topic 发送消息 → Broker 检测到后,若开关为 true 则自动创建 |
| 消费者触发场景 | 向不存在的 Topic 发起订阅(如 subscribe ("test3"))→ 同样触发 Broker 创建 |
2. 触发时机:
生产者向不存在的主题投递一个消息;消费者订阅某个不存在的主题
3. 生成的主题配置:
(分区数 = 1、副本因子 = 1);
4. 如何验证:
- 查看 Broker 的 server.properties 文件:
grep auto.create.topics.enable $KAFKA_HOME/config/server.properties; - 用命令查看集群当前配置:
kafka-configs.sh --bootstrap-server localhost:9092 --describe --entity-type brokers --entity-default。
生产环境务必关闭该配置,所有 Topic 手动创建(指定分区数、副本因子、存储策略等),避免无效 Topic 占用资源或参数不符合业务需求。
二、实操验证:
1. 生产者向不存在的主题投递消息(至少一条)
bash
panda@ubuntu02:~/share/4.中间件/4.3.1-kafka-principle/kafka_2.11-2.0.0/bin$ sh kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
test
test_2
panda@ubuntu02:~/share/4.中间件/4.3.1-kafka-principle/kafka_2.11-2.0.0/bin$ sh kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test3
>fffffffffffffff
[2026-03-08 05:22:43,613] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 1 : {test3=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
>sss
>cccccccccccccca
panda@ubuntu02:~/share/4.中间件/4.3.1-kafka-principle/kafka_2.11-2.0.0/bin$ sh kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
test
test3
test_2
LEADER_NOT_AVAILABLE
- Broker 检测到
test3不存在,且auto.create.topics.enable=true,于是自动创建了test3Topic; - Topic 创建后,Kafka 需要为每个分区选举 Leader(负责读写的 Broker 节点),这个选举过程需要几毫秒到几秒的时间;
- 在 Leader 选举完成前,Producer 再次尝试获取元数据时,就会返回
LEADER_NOT_AVAILABLE警告; - 等 Leader 选举完成后,Producer 会自动重试,消息就能正常投递了(后续输入的
ssscccc等消息,应该能正常发送)。
2. 消费者订阅不存在的主题
bash
panda@ubuntu02:~/share/4.中间件/4.3.1-kafka-principle/kafka_2.11-2.0.0/bin$ sh kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
test
test3
test_2
panda@ubuntu02:~/share/4.中间件/4.3.1-kafka-principle/kafka_2.11-2.0.0/bin$ sh kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test5 --from-beginning
[2026-03-08 05:27:01,461] WARN [Consumer clientId=consumer-1, groupId=console-consumer-59490] Error while fetching metadata with correlation id 2 : {test5=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
^CProcessed a total of 0 messages
panda@ubuntu02:~/share/4.中间件/4.3.1-kafka-principle/kafka_2.11-2.0.0/bin$ sh kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
test
test3
test5
test_2
这个场景之前生产者的情况本质完全一样:
-
Broker 检测到
test5不存在,且auto.create.topics.enable=true,于是自动创建了test5Topic 。这一点可以从你第二次执行kafka-topics.sh --list的结果中看到,test5已经出现在列表里了。 -
LEADER_NOT_AVAILABLE警告的原因和生产者场景一样,这个警告是因为 Topic 刚被创建,分区 Leader 还没完成选举,属于正常的 "创建后短暂延迟" 现象,不是创建失败。等 Leader 选举完成后,消费者就能正常消费消息了
3.结论
- 无论是生产者发送消息 ,还是消费者订阅 Topic ,只要 Broker 端的
auto.create.topics.enable=true,且目标 Topic 不存在,都会触发自动创建机制。 - 自动创建的 Topic 分区数、副本因子都是默认值(通常是 1 个分区、1 个副本),无法满足高并发、高可用的业务需求。
- 生产环境务必关闭
auto.create.topics.enable=false,所有 Topic 手动创建,避免不可控的风险。
三、注意:2.x的libkafka的c++代码
-
produce可以触发主题自动创建
-
consume不会触发,而是会触发

此时主题并未自动创建