Kafka Consumer需要较长的投票时间

时间:2019-03-08 16:52:49

标签: java apache-kafka kafka-consumer-api

使用Kafka / Java进行以下配置

    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, this.bootstrapServers);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, this.groupId);
    props.put(ConsumerConfig.CLIENT_ID_CONFIG, UUID.randomUUID().toString());
    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
    props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, this.maxPollRecords);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, keyDeserializerClass.getName());
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, valueDeserializerClass.getName());
    props.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, IsolationLevel.READ_COMMITTED.toString().toLowerCase(Locale.ROOT));

我有一个简单的轮询循环,例如:

consumer.poll(Duration.ofMillis(200));

我注意到一些奇怪的行为。持续时间为0时,不返回任何结果。在本地持续200毫秒的时间,我会得到一些结果,但是在另一个生产环境中,它从不返回结果,它至少需要1s。

据我所知,poll方法将等待,直到找到至少一个结果为止。持续时间为0时,它至少应该返回已经到达的结果,而不应该总是不返回任何结果。

解释是什么?

2 个答案:

答案 0 :(得分:1)

根据文档:

public ConsumerRecords<K,V> poll​(long timeout)
timeout - The time, in milliseconds, spent waiting in poll if data is not available in the buffer. If 0, returns immediately with any records that are available currently in the buffer, else returns empty. Must not be negative.

因此,基本上,当轮询请求阻塞了正在调用该线程的线程时,轮询持续时间是它可以阻塞该线程的最长时间。因此,如果超时时间为零或小于发出请求并获得使用者响应的时间,那么将不返回任何记录。

仅供参考,如果我们将此超时设置得很高,并将消费者的max.poll.records属性设置为我们想要的值,假设max.poll.records : "10",那么在获取10条记录后,轮询本身将结束(即使超时)大)。因此,理想情况下需要知道网络延迟,否则我上面提到的技巧很好用。

答案 1 :(得分:0)

主要问题是您可能没有存储poll()的输出。

ConsumerRecords records = consumer.poll(10000);

您需要将poll的结果存储在ConsumerRecords中。您可以找到示例代码段here