Linux C/C++ 学习日记(80):Kafka(八):topic会自动创建吗?

注:该文用于个人学习记录和知识交流,如有不足,欢迎指点。

一、主题自动创建机制

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

  1. Broker 检测到 test3 不存在,且 auto.create.topics.enable=true,于是自动创建了 test3 Topic
  2. Topic 创建后,Kafka 需要为每个分区选举 Leader(负责读写的 Broker 节点),这个选举过程需要几毫秒到几秒的时间;
  3. 在 Leader 选举完成前,Producer 再次尝试获取元数据时,就会返回 LEADER_NOT_AVAILABLE 警告;
  4. 等 Leader 选举完成后,Producer 会自动重试,消息就能正常投递了(后续输入的 sss cccc 等消息,应该能正常发送)。

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

这个场景之前生产者的情况本质完全一样

  1. Broker 检测到 test5 不存在,且 auto.create.topics.enable=true,于是自动创建了 test5 Topic 。这一点可以从你第二次执行 kafka-topics.sh --list 的结果中看到,test5 已经出现在列表里了。

  2. 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++代码

  1. produce可以触发主题自动创建

  2. consume不会触发,而是会触发

此时主题并未自动创建

相关推荐
暴力求解2 小时前
Linux---磁盘与文件系统(三)
linux·运维·服务器
Don.TIk2 小时前
深度学习学习笔记
笔记·深度学习·学习
rain_in_spring2 小时前
十、项目:营销中心
linux·运维·服务器
知识分享小能手2 小时前
PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 数据备份与还原详解 —语法、案例与实战(16)
数据库·学习·postgresql
星幻元宇VR2 小时前
VR科普学习一体机,在学校教育的应用前景
科技·学习·安全·vr·虚拟现实
灰色小旋风2 小时前
力扣第九题C++回文数
c++·算法·leetcode
U盘失踪了2 小时前
Debian 使用 Xfce 桌面
linux·运维
庭前云落2 小时前
从零开始的OpenZeppelin学习 1| 安装、使用
学习·区块链
北冥湖畔的燕雀2 小时前
Linux Shell开发实战:从零打造命令行工具
linux·运维·服务器