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

此时主题并未自动创建

相关推荐
小小龙学IT10 分钟前
ZeroMQ(libzmq)开源消息库深度解析:brokerless 时代的轻量消息内核
c++·开源
Canmag 兴隆磁性28 分钟前
C 系列充磁机
c语言·开发语言·学习·永磁材料·充磁·退磁
不会就选b40 分钟前
Linux之网络基础(二)
linux·运维·网络
Benny_Tang1 小时前
题解:P10230 [COCI 2023/2024 #4] Lepeze
c++·算法
我变成萤火虫1 小时前
反悔贪心(经典题目讲解)
c++·算法·贪心算法·stl·排序算法·反悔贪心
莫浅子1 小时前
Day 4:USB 2.0 时序与带宽预算
linux·运维·网络
ly76892 小时前
Linux 从入门到实践:系统架构、常用命令、服务管理与故障排查详解
linux·运维·系统架构
_Narcissus_2 小时前
排序算法总结表格
c语言·数据结构·c++·笔记·算法·排序算法·总结
新手unity自用笔记2 小时前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
zyf1044162 小时前
暑期实践日志 Day32:完成第六章字幕添加,推进工作
学习·计算机网络·剪辑·暑期实践·课题任务