【问题标题】:Spring Boot + Kafka handle if Kafka is not available如果 Kafka 不可用,则 Spring Boot + Kafka 句柄
【发布时间】:2022-01-08 19:27:36
【问题描述】:

我正在尝试将一些非关键数据推送到 Kafka,但我仍然希望应用程序在没有 Kafka 的情况下运行。但是我的 Spring Boot(使用 spring-kafka 2.7.2)现在无法正常启动,并且处于以下循环中:

[AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.

基本上这会阻止对我的应用程序的所有 http 请求,因为我猜在连接到 Kafka 之前无法完成启动过程。大概一分钟后,我收到“Tomcat 已启动 xx”消息,所以现在应用程序运行了,我猜?

除了现在调用 Kafka 相关服务时,它再次进入循环:

org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.

[ad | producer-1] org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected

这又持续了 60 秒,然后停止,我收到内部服务器错误。

我想简单地将 Kafka 视为一项可选服务,即使在生产中我们会不断启动它,这对于任何测试或开发服务器或开发机器等可能都不是真的。基本上“如果它正在运行,把这个数据推送到这个topic,如果没有运行,就好”的情况。

有没有办法用 Kafka 配置 Spring,这样它就不会阻塞这样的一切(理想情况下,这一切都应该在后台线程中运行,这是另一回事,但很奇怪 Kafka 会阻塞所有主线程请求)?

谢谢

【问题讨论】:

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


【解决方案1】:
I have experienced the same in one of the projects so I did enabled/disabled  the Kafka service class through conditionalOnExpression like below.

@Service
@ConditionalOnExpression(value = "'${kafka.enabled}'.equalsIgnoreCase('true')")
public class kafkaPosting {
....
}

请注意在您的 application.properties 文件中添加属性 (kafka.enabled)。

此外,如果您要将 Kafka bean 自动装配到您的服务类中,那么不要忘记将以下内容添加到注入中。

@Autowired(required=false)
KafkaClient kafkaClient;

这将有助于根据配置的属性绕过 kafka。

【讨论】:

    猜你喜欢
    • 2018-12-23
    • 2017-10-28
    • 2021-06-16
    • 1970-01-01
    • 2020-07-21
    • 2019-01-18
    • 1970-01-01
    • 2020-11-13
    • 2020-02-25
    相关资源
    最近更新 更多