当无法连接到Kafka时,强制Spring引导应用程序失败
我想让我的spring启动应用程序在启动时失败,如果它无法连接到kafka代理。我的应用程序仅将消息发布到主题。我将这一行添加到我的属性文件中,但到目前为止运气不佳。kafka.admin.fail fast=true当无法连接到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
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
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;
}