当无法连接到Kafka时,强制Spring引导应用程序失败

当无法连接到Kafka时,强制Spring引导应用程序失败,spring,spring-boot,apache-kafka,kafka-producer-api,spring-kafka,Spring,Spring Boot,Apache Kafka,Kafka Producer Api,Spring Kafka,我想让我的spring启动应用程序在启动时失败,如果它无法连接到kafka代理。我的应用程序仅将消息发布到主题。我将这一行添加到我的属性文件中,但到目前为止运气不佳。kafka.admin.fail fast=truefail fast只有在上下文中至少有一个NewTopicbean时才会起作用(因此管理员将尝试检查主题是否存在,如果不存在,则创建它) 关于如何加速fail fast的补充 TL;DRSpring Boot 2.4.5自动配置不允许您使用env参数快速加速故障。将此添加到@Con

我想让我的spring启动应用程序在启动时失败,如果它无法连接到kafka代理。我的应用程序仅将消息发布到主题。我将这一行添加到我的属性文件中,但到目前为止运气不佳。kafka.admin.fail fast=true
fail fast
只有在上下文中至少有一个
NewTopic
bean时才会起作用(因此管理员将尝试检查主题是否存在,如果不存在,则创建它)


关于如何加速fail fast的补充

TL;DRSpring Boot 2.4.5自动配置不允许您使用env参数快速加速故障。将此添加到@Configuration以获得10秒超时:

@Bean
public KafkaAdmin kafkaAdmin(@Autowired KafkaProperties properties) {
    KafkaAdmin kafkaAdmin = new KafkaAdmin(properties.buildAdminProperties());
    kafkaAdmin.setFatalIfBrokerNotAvailable(properties.getAdmin().isFailFast());

    /* speed up fail fast */
    kafkaAdmin.setOperationTimeout(5);
    kafkaAdmin.setCloseTimeout(5);

    return kafkaAdmin;
}
更详细的答案

执行类
org.springframework.kafka.core.KafkaAdmin
initialize()
方法时会发生快速失败。此方法可能会阻止:

  • 如果找到新主题,它将阻止主题创建,最多持续
    operationTimeout
  • 如果主题创建失败,它将阻止释放资源长达
    closeTimeout
  • 默认情况下,这些值分别为30秒和10秒(在上述类中硬编码)。您可以使用set方法重新定义它们:
    setOperationTimeout(int-sec)
    setCloseTimeout(int-sec)

    弹簧靴怎么样
    KafkaAdmin
    bean是在类
    org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration
    中创建的。您可以猜到,Spring Boot根本不设置超时:

    @Bean
    @ConditionalOnMissingBean
    public KafkaAdmin kafkaAdmin() {
        KafkaAdmin kafkaAdmin = new KafkaAdmin(this.properties.buildAdminProperties());
        kafkaAdmin.setFatalIfBrokerNotAvailable(this.properties.getAdmin().isFailFast());
        return kafkaAdmin;
    }
    

    谢谢你的回答。因此,这将从正在运行的应用程序创建主题。如果我使用一个主题,我需要的是类似的行为。在这种情况下,应用程序将失败,因为用
    KafkaListener
    注释的方法将尝试连接kafka代理并使用消息。使用者在启动应用程序的线程的不同线程上运行。添加主题bean是实现您想要的功能的唯一现成机制。您可以在
    start()
    中编写自己的
    Lifecycle
    bean连接到代理。但我不知道你为什么要这么做,因为你的消费者无论如何都需要这个话题。而且,如果主题已经存在,则不会执行任何操作,管理员只需检查它是否存在。是否有可能使它更快地失败?在我的例子中,应用程序在失败(强制硬I/O线程关闭)之前需要约40秒,尽管它比~2min40秒要好得多,没有
    fail fast
    功能。最好问一个新问题,而不是评论一个旧答案。人们更容易找到答案。无论如何,在新问题中引用答案。您可以尝试将kafka admin client属性
    request.timeout.ms
    从默认值(30秒)减少。使用Boot,它是
    spring.kafka.admin.properties.request.timeout.ms=5000
    @Bean
    @ConditionalOnMissingBean
    public KafkaAdmin kafkaAdmin() {
        KafkaAdmin kafkaAdmin = new KafkaAdmin(this.properties.buildAdminProperties());
        kafkaAdmin.setFatalIfBrokerNotAvailable(this.properties.getAdmin().isFailFast());
        return kafkaAdmin;
    }