kafka AdminClient频繁报Timed out waiting to send the call

张乘辉 发表于: 2019-11-21   最后更新时间: 2019-11-21 16:19:54   5,689 游览

调用 org.apache.kafka.clients.admin.AdminClient#describeTopics 方法,发现频繁报 'Timed out waiting to send the call' 的错误,经过源码分析,是因为服务端经过 defaultTimeoutMs(默认120秒)时间没有响应给客户端,锁报了这个错,客户端会将请求封装成一个 Call 对象,并放到 AdminClientRunnable 中的 newCalls 集合中,初始化时会启动一条线程去执行。

那么想问下什么情况下会导致这个问题频繁出现呢?

kafka版本:2.2.1

org.apache.kafka.clients.admin.KafkaAdminClient#describeTopics

runnable.call(new Call("describeTopics", calcDeadlineMs(now, options.timeoutMs()),
            new ControllerNodeProvider()) {
            // ...
            }

org.apache.kafka.clients.admin.KafkaAdminClient#calcDeadlineMs

private long calcDeadlineMs(long now, Integer optionTimeoutMs) {
        if (optionTimeoutMs != null)
            return now + Math.max(0, optionTimeoutMs);
        return now + defaultTimeoutMs;
    }

org.apache.kafka.clients.admin.KafkaAdminClient.AdminClientRunnable#timeoutCallsToSend

 private int timeoutCallsToSend(TimeoutProcessor processor) {
            int numTimedOut = 0;
            for (List<Call> callList : callsToSend.values()) {
                numTimedOut += processor.handleTimeouts(callList,
                    "Timed out waiting to send the call.");
            }
            if (numTimedOut > 0)
                log.debug("Timed out {} call(s) with assigned nodes.", numTimedOut);
            return numTimedOut;
        }
添加评论
你的答案

查看kafka相关的其他问题或提一个您自己的问题