Java Kafka adminClient抛出TimeoutException

Java Kafka adminClient抛出TimeoutException,java,apache-kafka,spring-kafka,Java,Apache Kafka,Spring Kafka,我有一个健康线程,从我的辅助应用程序每隔5秒检查一次Kafka集群的状态。然而,我时不时会收到TimeoutException: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Aborted due to timeout. at org.apache.kafka.common.internals.KafkaFutureImpl.wrapAndThrow(Kafka

我有一个健康线程,从我的辅助应用程序每隔5秒检查一次Kafka集群的状态。然而,我时不时会收到
TimeoutException

java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Aborted due to timeout.
at org.apache.kafka.common.internals.KafkaFutureImpl.wrapAndThrow(KafkaFutureImpl.java:45)
at org.apache.kafka.common.internals.KafkaFutureImpl.access$000(KafkaFutureImpl.java:32)
at org.apache.kafka.common.internals.KafkaFutureImpl$SingleWaiter.await(KafkaFutureImpl.java:89)
at org.apache.kafka.common.internals.KafkaFutureImpl.get(KafkaFutureImpl.java:260)
我也有外部监控集群的工具(
Cruise Control
Grafana
),但没有一个指向集群中的任何问题。此外,我的worker应用程序不断地消耗消息,而且似乎没有一条消息失败

为什么我偶尔会超时?如果代理没有关闭,那么我认为我的配置中的某些东西关闭了。我将超时时间设置为5秒,这似乎已经足够了

我的AdminClient配置:

 @Bean
public AdminClient adminClient() {
    return KafkaAdminClient.create(adminClientConfigs());
}

 public Map<String, Object> adminClientConfigs() {
    Map<String, Object> props = new HashMap<>();
    props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, serverAddress);
    props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, 5000);
    return props;
}
2件事:

  • 默认请求超时为30秒。通过将其设置为较小的值,可以增加缓慢请求超时的风险。如果1000个请求中有一个(0.1%)需要5秒钟以上,因为您每隔几秒钟查询一次,每天都会看到几个失败

  • 要调查某些呼叫花费更长时间的原因,您可以做以下几件事:

    • 检查Kafka客户端日志<代码>描述群集()可能需要启动到群集的新连接。在这种情况下,客户端还必须发送
      APIVersionRequest
      ,并且根据您的配置,可能会建立TLS连接和/或执行SASL身份验证。如果发生上述任何情况,应在客户端日志中清除。(您可能需要稍微提高日志级别才能看到所有这些)

    • 检查代理请求度量
      describeCluster()
      转换为发送给代理的
      MetadataRequest
      。您可以跟踪处理请求所需的时间。在您的案例中,请参阅中描述的度量,尤其是:
      kafka.network:type=RequestMetrics,name=*,request=Metadata

  • @Autowired
    private AdminClient adminClient;
    
     private void addCluster() throws ExecutionException, InterruptedException {
            adminClient.describeCluster().nodes().get().forEach(node -> brokers.add(node.host()));
        }