Java Kafka adminClient抛出TimeoutException
我有一个健康线程,从我的辅助应用程序每隔5秒检查一次Kafka集群的状态。然而,我时不时会收到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
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件事:
- 检查Kafka客户端日志<代码>描述群集()可能需要启动到群集的新连接。在这种情况下,客户端还必须发送
,并且根据您的配置,可能会建立TLS连接和/或执行SASL身份验证。如果发生上述任何情况,应在客户端日志中清除。(您可能需要稍微提高日志级别才能看到所有这些)APIVersionRequest
- 检查代理请求度量
转换为发送给代理的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()));
}