【问题标题】:Managing Kafka Topic with spring用 spring 管理 Kafka 主题
【发布时间】:2018-11-27 07:10:44
【问题描述】:

我们计划在我们的应用程序中使用 Kafka 进行排队。我在 RabbitMQ 和 Spring 方面有一些经验。

使用 RabbitMQ 和 Spring,我们曾经在启动 spring 服务时管理队列创建。

对于 Kafka,我不确定创建主题的最佳方式是什么?有没有办法用 Spring 管理主题。

或者,我们是否应该编写一个单独的脚本来帮助创建主题?维护一个单独的脚本来创建主题对我来说似乎有点奇怪。

任何建议将不胜感激。

【问题讨论】:

  • kafka 1.1.0 默认将auto.create.topics.enable 设置为true,如果可以满足您的生产要求,您已经设置好了:D
  • 是否建议在生产环境中启用它?
  • 一般来说,我看不到保持启用它的问题,因为 99% 的时间 kafka 被配置为只能通过本地网络访问,除此之外,您可以添加身份验证,因此这取决于您的架构和安全要求
  • 是的。它只能通过本地网络访问
  • 我宁愿禁用它以防止应用程序意外创建错误/不必要的主题。如果它在本地网络上,pre-prod 应用程序启动可能能够访问集群?取决于您的 NW 设置/安全性,但恕我直言,禁用可能是明智的选择。

标签: java spring-boot apache-kafka rabbitmq spring-kafka


【解决方案1】:

在春季,可以在应用程序启动期间使用 bean 创建主题:

@Bean
public KafkaAdmin admin() {
    Map<String, Object> configs = new HashMap<>();
    configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,
            StringUtils.arrayToCommaDelimitedString(kafkaEmbedded().getBrokerAddresses()));
    return new KafkaAdmin(configs);
}

@Bean
public NewTopic topic1() {
    return new NewTopic("foo", 10, (short) 2);
}

或者,您可以通过自动装配AdminClient 来编写自己的创建主题,例如从输入文件中读取列表或指定分区号等高级属性:

@Autowired
private KafkaAdmin admin;
//...your implementation

另请注意,由于 Kafka 1.1.0 默认启用auto.create.topics.enable (see Broker configs)。

更多信息参考spring-kafkadocs

【讨论】:

  • Spring Boot 自动配置了一个KafkaAdmin,所以你只需要在启动应用程序中添加NewTopic @Beans。
【解决方案2】:

要在 Spring Boot 中自动创建 Kafka 主题,只有这个是必需的:

@Bean
public NewTopic topic1() {
    return new NewTopic("foo", 10, (short) 2);

    //foo: topic name
    //10: number of partitions
    //2: replication factor
}

Kafka Admin 正在由 Spring Boot 自动创建和配置。

Spring Kafka 2.3 版本引入了TopicBuilder 类,使构建主题更加流畅和直观:

@Bean
public NewTopic topic(){
    return TopicBuilder.name("foo")
        .partitions(10)
        .replicas(2)
        .build();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 2021-02-07
    • 2018-04-07
    • 1970-01-01
    • 2021-02-23
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多