【问题标题】:Is there a "Circuit Breaker" for Spring Boot Kafka client?Spring Boot Kafka 客户端是否有“断路器”?
【发布时间】:2021-12-23 03:09:35
【问题描述】:

如果 Kafka 服务器(暂时)关闭,我的 Spring Boot 应用程序ReactiveKafkaConsumerTemplate 会一直尝试连接不成功,从而导致不必要的流量并弄乱日志文件:

2021-11-10 14:45:30.265  WARN 24984 --- [onsumer-group-1] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-group-1, groupId=consumer-group] Connection to node -1 (localhost/127.0.0.1:29092) could not be established. Broker may not be available.
2021-11-10 14:45:32.792  WARN 24984 --- [onsumer-group-1] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-group-1, groupId=consumer-group] Bootstrap broker localhost:29092 (id: -1 rack: null) disconnected
2021-11-10 14:45:34.845  WARN 24984 --- [onsumer-group-1] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-group-1, groupId=consumer-group] Connection to node -1 (localhost/127.0.0.1:29092) could not be established. Broker may not be available.
2021-11-10 14:45:34.845  WARN 24984 --- [onsumer-group-1] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-group-1, groupId=consumer-group] Bootstrap broker localhost:29092 (id: -1 rack: null) disconnected

是否可以使用类似断路器的东西(灵感herehere),所以Spring Boot Kafka客户端以防发生故障 (或者更好的是连续几次失败)减慢连接尝试的速度,只有在服务器重新启动后才能恢复正常速度?

是否已经有现成的配置参数,或者其他解决方案?

我知道parameter reconnect.backoff.ms,这就是我创建ReactiveKafkaConsumerTemplate bean 的方式:

@Bean
public ReactiveKafkaConsumerTemplate<String, MyEvent> kafkaConsumer(KafkaProperties properties) {
    final Map<String, Object> map = new HashMap<>(properties.buildConsumerProperties());
    map.put(ConsumerConfig.GROUP_ID_CONFIG, "MyGroup");
    map.put(ConsumerConfig.RECONNECT_BACKOFF_MS_CONFIG, 10_000L);
    final JsonDeserializer<DisplayCurrencyEvent> jsonDeserializer = new JsonDeserializer<>();
    jsonDeserializer.addTrustedPackages("com.example.myapplication");

    return new ReactiveKafkaConsumerTemplate<>(
            ReceiverOptions
                    .<String, MyEvent>create(map)
                    .withKeyDeserializer(new ErrorHandlingDeserializer<>(new StringDeserializer()))
                    .withValueDeserializer(new ErrorHandlingDeserializer<>(jsonDeserializer))
                    .subscription(List.of("MyTopic")));
}

消费者仍然每 3 秒尝试连接一次。

【问题讨论】:

    标签: java spring-boot apache-kafka-streams spring-kafka circuit-breaker


    【解决方案1】:

    https://kafka.apache.org/documentation/#consumerconfigs_retry.backoff.ms

    在尝试重新连接到给定主机之前等待的基本时间。这避免了在紧密循环中重复连接到主机。此退避适用于客户端到代理的所有连接尝试。

    https://kafka.apache.org/documentation/#consumerconfigs_reconnect.backoff.max.ms

    重新连接到反复连接失败的代理时等待的最长时间(以毫秒为单位)。如果提供,每台主机的退避将在每次连续连接失败时呈指数增长,直至达到此最大值。计算回退增量后,添加 20% 的随机抖动以避免连接风暴。

    【讨论】:

    • 我知道reconnect.backoff.ms 设置,我想我已经正确使用了它(?) - 请参阅我编辑的答案。但是,消费者仍然每 3 秒尝试连接一次。
    • 您还需要设置...max... 属性。
    • 到相同的数字,即在我的情况下为 10_000 毫秒?我不确定我是否理解第二个参数的描述以及它与第一个参数的确切区别。
    • 你能解释一下这两个参数的区别吗?第一个什么时候申请?似乎在第一批“连接尝试”中,它总是像 3 秒。即使从日志来看,它们似乎是两组不同的参数值,ConsumerConfig 在日志中多次显示不同的值...
    • 对不起;我不知道 kafka 客户的内部情况;尝试在他们的用户邮件列表中询问:kafka.apache.org/contact
    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 2015-08-26
    • 2022-11-28
    • 2020-08-08
    • 2021-02-09
    • 2021-05-04
    • 2019-06-29
    • 2017-08-28
    相关资源
    最近更新 更多