Kafka adminClient抛出TimeoutException

时间:2020-05-25 07:46:10

标签: java apache-kafka spring-kafka

我有一个运行状况线程,该线程每隔5秒从我的工作程序应用程序检查一次Kafka集群的状态。但是,偶尔我会得到DataLoader

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),它们都没有指出群集中的任何问题。另外,我的工作程序在不断消耗消息,而且似乎都没有失败。

为什么我偶尔会出现此超时?如果代理未关闭,则我认为配置中的某些功能已关闭。我将超时设置为5秒,这似乎绰绰有余。

我的AdminClient配置:

Grafana

我如何检查集群(而不是在代理列表上运行逻辑):

 @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;
}

1 个答案:

答案 0 :(得分:1)

2件事:

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

  2. 要调查为什么某些通话会花更长的时间,您可以做一些事情:

    • 检查Kafka客户端日志。 describeCluster()可能需要启动与集群的新连接。在这种情况下,客户端也将必须发送ApiVersionsRequest,并且根据您的配置,客户端可能会建立TLS连接和/或执行SASL身份验证。如果发生任何这些情况,则应在客户端日志中将其清除。 (您可能需要稍微提高一下日志级别才能查看所有这些信息。)

    • 检查代理请求指标。 describeCluster()转换为发送给经纪人的MetadataRequest。您可以跟踪处理请求所花费的时间。请根据您的情况查看docs中描述的指标,尤其是:kafka.network:type=RequestMetrics,name=*,request=Metadata