我有一个运行状况线程,该线程每隔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;
}
答案 0 :(得分:1)
2件事:
默认请求超时为30秒。通过将其设置为较小的值,可以增加请求缓慢的超时风险。如果每1000个请求中有一个请求(0.1%)花费的时间超过5秒,因为您每隔几秒钟就会查询一次,那么您每天都会看到几次失败。
要调查为什么某些通话会花更长的时间,您可以做一些事情:
检查Kafka客户端日志。 describeCluster()
可能需要启动与集群的新连接。在这种情况下,客户端也将必须发送ApiVersionsRequest
,并且根据您的配置,客户端可能会建立TLS连接和/或执行SASL身份验证。如果发生任何这些情况,则应在客户端日志中将其清除。 (您可能需要稍微提高一下日志级别才能查看所有这些信息。)
检查代理请求指标。 describeCluster()
转换为发送给经纪人的MetadataRequest
。您可以跟踪处理请求所花费的时间。请根据您的情况查看docs中描述的指标,尤其是:kafka.network:type=RequestMetrics,name=*,request=Metadata