【问题标题】:How to configure Spring Boot Kafka client so it does not try to connect如何配置 Spring Boot Kafka 客户端使其不尝试连接
【发布时间】:2022-01-07 22:03:21
【问题描述】:

这与Is there a "Circuit Breaker" for Spring Boot Kafka client?有关,但我仍然认为这是一个不同的问题:)

我们需要配置 Spring Boot Kafka 客户端,使其根本不尝试连接。

用例是在测试环境中我们没有运行 Kafka,但我们仍然需要构建完整的 Spring Boot 上下文,因此使这个 bean 以配置文件为条件是行不通的。我们不在乎 ben 是否未连接,但我们需要它存在。

问题在于不成功的连接尝试大约需要 30-40 秒,而且我们的测试速度明显变慢。

configuration parameters 中的哪个或它们的哪个组合完全禁止连接尝试,或者至少强制客户端仅尝试一次?

多次重试连接的代码是这样的:

@Bean
public KafkaAdmin.NewTopics topics() {
    return new KafkaAdmin.NewTopics(
            TopicBuilder.name("MyTopic").build()
    );
}

它反复产生这个警告:

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

以下代码只尝试连接一次:

@Bean
public ReactiveKafkaConsumerTemplate<String, MyEvent> myConsumer(KafkaProperties properties) {
    return createConsumer(properties, "MyTopic", "MyConsumerGroup");
}

public <E> ReactiveKafkaConsumerTemplate<String, E> createConsumer(KafkaProperties properties, String topic, String consumerGroup) {
    final Map<String, Object> map = configureKafkaProperties(properties, consumerGroup);

    return new ReactiveKafkaConsumerTemplate<>(
        ReceiverOptions.<String, E>create(map)
            .subscription(List.of(topic)));
}

生产

WARN 7268 ... org.apache.kafka.clients.NetworkClient   : Connection to node -1 (localhost/127.0.0.1:29092) could not be established. Broker may not be available.

我也试过设置属性
spring.kafka.admin.fail-fast=true
但这似乎根本没有效果。

【问题讨论】:

  • 你有什么理由不能把kafka.enable=false 放在你的application.properties 中吗?如果不是autoStartup = "${auto.start:false}" 应该是你的朋友。如果没有关于测试的更多信息,我不是 100% 确定
  • 我的错,它不是标准设置。您将使用 @ConditionalOnProperty("kafka.enabled") 注释您的配置文件,然后为您的测试禁用它
  • 那么我评论的后半部分应该对你有用。
  • autoStartup = "false" 是您的 KafkaListener 的设置,这意味着它不会自动启动容器,同时仍会创建 Kafka Bean。我之前的评论概述了如何将其设置为标准关闭。如果您愿意,您可以在标准上实现它,然后将其关闭以进行测试。如前所述,这应该可以解决您的问题,尽管您提供的信息有限我不是 100% 确定参考:docs.spring.io/spring-kafka/docs/2.6.2/reference/html/…

标签: java spring-boot configuration apache-kafka-streams spring-kafka


【解决方案1】:

Spring Boot 自动配置一个 KafkaAdmin,默认情况下,它将连接到代理以创建任何 NewTopic bean。您可以将其autoCreate 属性设置为false。

    /**
     * Set to false to suppress auto creation of topics during context initialization.
     * @param autoCreate boolean flag to indicate creating topics or not during context initialization
     * @see #initialize()
     */
    public void setAutoCreate(boolean autoCreate) {

编辑

要获得对 KafkaAdmin 的引用,只需将其作为参数添加到任何 bean 定义即可。

例如

@Bean
public KafkaAdmin.NewTopics topics(KafkaAdmin admin) {
    admin.setAutoCreate(false);
    return new KafkaAdmin.NewTopics(
            TopicBuilder.name("MyTopic").build()
    );
}

另见KafkaAdmin.initialize()

    /**
     * Call this method to check/add topics; this might be needed if the broker was not
     * available when the application context was initialized, and
     * {@link #setFatalIfBrokerNotAvailable(boolean) fatalIfBrokerNotAvailable} is false,
     * or {@link #setAutoCreate(boolean) autoCreate} was set to false.
     * @return true if successful.
     * @see #setFatalIfBrokerNotAvailable(boolean)
     * @see #setAutoCreate(boolean)
     */
    public final boolean initialize() {

当使用@KafkaListener 设置autoStartup = "false" 以防止消费者在上下文初始化时启动。

使用 reactor,只需不要订阅 receive*() 方法返回的 Flux(这就是触发消费者创建的原因)。

【讨论】:

  • 再次感谢 Gary 的帮助。特别是对于带有“订阅Flux”的部分——这特别棘手,因为代码在我的KafkaConfiguration 类之外,我没有意识到连接尝试会发生在那里。无论如何,如果 Kafka 有某种 single do-not-connect-mode 参数正好用于这个用例,那就太好了:“我需要实例化所有的 bean,但我不打算使用它们”。它经常发生在单元测试中——您只需要构建完整的 Spring 上下文并将其重用于多个单元测试以节省测试运行时间。
  • 请针对 spring-kafka 打开一个新功能请求 - KafkaReceiver 有一个重载的静态方法 static &lt;K, V&gt; KafkaReceiver&lt;K, V&gt; create(ConsumerFactory factory, ReceiverOptions&lt;K, V&gt; options) 并且测试可以用创建 MockConsumer 的方法替换标准消费者工厂 @Bean (或者如果您根本不需要它,可以使用模拟工厂)。模板不会公开此重载。此外,您可以直接使用KafkaReceiver - 该模板是KafkaReceiver 的非常轻量级的包装器。
猜你喜欢
  • 2020-08-08
  • 2021-02-26
  • 2020-12-09
  • 2020-05-02
  • 2017-04-03
  • 1970-01-01
  • 2016-04-15
  • 2019-05-06
  • 2016-12-18
相关资源
最近更新 更多