Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

    • Kafka的架构
    • docker搭建Kafka集群
    • spring关于kafka的最全配置
    • kafka分主副节点吗
    • kafka的 topic, key , 分区的关系,以及数量对应关系,以及默认值
    • spring项目是事先创建topic还是代码里创建
      • 一个topic一般创建几个分区,几个副本数,只有三个broker的话又是怎么分布的
      • 一共有3个broker,一个topic有10个分区,副本数最大为3?分区又是怎么分布在3个broker上的?用的什么算法
      • 副本数和分区数什么区别
      • 我还是不明白副本数,请画出具体的分布图,3个broker,某个topic10个分区
      • Leader+​​Follower = 副本数?
      • ​​ISR(In-Sync Replicas)是什么,最多有多少个,这个数量怎么得来的
      • 在 Spring Kafka 中发送消息
      • 向kafka中发送重复的数据会怎么样
      • send消息时,key有什么用?
    • 数据结构

    • 算法

    • OJ

    • 从道家哲学看计算机?
    • 后端
    • Kafka
    plantre
    2025-06-22
    目录

    spring项目是事先创建topic还是代码里创建

    在Spring项目中创建Kafka Topic的选择取决于具体场景和需求,以下是两种方式的详细对比及实现方案:


    # ⚙️ 一、两种创建方式对比

    方式 适用场景 优点 缺点
    事先手动创建 生产环境、需精确控制分区/副本数、权限严格管控的环境 配置明确(分区、副本可自定义),符合运维规范 需额外运维操作,不够灵活
    代码中动态创建 开发/测试环境、快速验证、Topic配置简单且允许自动创建的场景 简化流程,与项目集成度高 默认配置简陋(1分区、无副本),需显式配置优化

    ✅ 关键结论:

    • 生产环境:优先手动创建(避免自动创建的默认配置风险)。
    • 开发/测试环境:推荐代码自动创建(提升效率)。

    # 🛠️ 二、代码中动态创建Topic的实现方案

    # 1. 配置Bean方式(Spring Boot自动触发)

    通过定义NewTopic Bean,Spring Boot启动时会自动创建Topic:

    import org.apache.kafka.clients.admin.NewTopic;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class KafkaTopicConfig {
        @Bean
        public NewTopic myTopic() {
            // 指定名称、分区数、副本数
            return new NewTopic("orders", 6, (short) 3); 
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    注意:

    • 若Topic已存在,则忽略创建(不会覆盖)。
    • 修改分区数需重启应用(分区数只能增加不能减少)。

    # 2. 编程式创建(灵活控制时机)

    使用AdminClient在任意代码位置动态创建:

    import org.apache.kafka.clients.admin.AdminClient;
    import org.apache.kafka.clients.admin.NewTopic;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.kafka.core.KafkaAdmin;
    import org.springframework.stereotype.Service;
    
    @Service
    public class TopicService {
        @Autowired
        private KafkaAdmin kafkaAdmin;
    
        public void createTopic(String name, int partitions, short replication) {
            try (AdminClient admin = AdminClient.create(kafkaAdmin.getConfigurationProperties())) {
                NewTopic topic = new NewTopic(name, partitions, replication);
                admin.createTopics(Collections.singleton(topic)).all().get();
            } catch (Exception e) {
                throw new RuntimeException("创建Topic失败", e);
            }
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    适用场景:

    • 需根据业务逻辑动态创建Topic(如多租户系统)。

    # ⚠️ 三、注意事项与生产建议

    1. 自动创建的默认风险

      • 若未显式配置NewTopic Bean,直接发送消息到不存在的Topic时,Kafka会自动创建该Topic,但分区数=1、副本数=1(可能引发性能或可靠性问题)。
      • 解决方案:在application.yml中显式配置所有需自动创建的Topic:
        spring:
          kafka:
            topics:
              - name: orders
                num-partitions: 6
                replication-factor: 3
              - name: payments
                num-partitions: 4
                replication-factor: 3
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
    2. 权限与配置要求

      • Broker需启用auto.create.topics.enable=true(默认开启,生产环境建议关闭)。
      • 代码创建需Kafka用户有CREATE权限(生产环境建议通过运维流程管控)。
    3. 分区数变更限制

      • 分区数只能增加不能减少,修改时需评估对Key哈希分布的影响(如顺序消费可能被打乱)。

    # 💎 四、决策指南

    场景 推荐方案 示例
    生产环境 事先手动创建(运维流程管控) kafka-topics.sh --create ...
    开发/测试环境 代码配置Bean自动创建 定义NewTopic Bean
    动态业务需求 编程式调用AdminClient 租户按需创建Topic

    总结:

    • 事先创建:生产环境首选,保障配置标准化与安全。
    • 代码创建:开发/测试场景提效,但需显式配置分区/副本数。
      根据团队协作规范和运维成熟度灵活选择,避免依赖Kafka默认自动创建机制。
    编辑 (opens new window)
    上次更新: 2025/06/24, 00:41:57
    kafka的 topic, key , 分区的关系,以及数量对应关系,以及默认值
    一个topic一般创建几个分区,几个副本数,只有三个broker的话又是怎么分布的

    ← kafka的 topic, key , 分区的关系,以及数量对应关系,以及默认值 一个topic一般创建几个分区,几个副本数,只有三个broker的话又是怎么分布的→

    最近更新
    01
    集成loki
    07-04
    02
    TCP的ESTABLISHED是什么意思
    06-24
    03
    安装1panel
    06-24
    更多文章>
    Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式