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不会触发,而是会触发

此时主题并未自动创建

相关推荐
大侠归来7 分钟前
Ubuntu 搭建 APUE 环境:从源码编译到第一个示例跑通
linux·运维·ubuntu
每天题库1 小时前
危险货物道路运输从业资格证题库刷题重点与错题梳理
学习·安全·考试·题库·考证
All for pursuit.1 小时前
【分治-3】347.前K个高频元素
数据结构·c++·算法·leetcode
头发够用的程序员1 小时前
TensorRT 自定义算子插件实战(一):从零手写 customScaledTanh
c++·人工智能·pytorch·python·深度学习·边缘计算·jetson
m4Rk_1 小时前
【论文阅读】Agent 记忆机制(86):Skill-Pro——用 Non-Parametric PPO 将交互经验演化为可复用技能
论文阅读·人工智能·学习·开源·github
哭泣方源炼蛊1 小时前
正则表达式c++内容汇集
数据库·c++·mysql·正则表达式
AOI小白新手上路2 小时前
从 Keil 调试视角看 51 指针,到 Cortex-M 内存映射访问寄存器 · 学习笔记
笔记·学习
别动我齐刘海2 小时前
简历技术栈全面复习——UDP / TCP / CAN / ZMQ / Protobuf 通信工程
网络·c++·python·tcp/ip·机器学习·udp·github
shdkfbbv2 小时前
【无标题】
linux·运维·服务器
Joe_Wang52 小时前
【从0到1学习JVM · 15】对象在堆里来回倒腾,究竟怎样才会进老年代?
java·jvm·学习·垃圾回收