Kafka:如何让消费者民意调查超时?

时间:2017-10-08 06:33:20

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

我正在使用Kafka 0.10.2并从Kafka接收记录,我有一个消费者调查循环,如下所示:

while (true) {
    ConsumerRecords<Long, String> records = consumer.poll(2000);
    int count= 0;
    long lasttimestamp = 0;
    long lastOffset = 0;
    for (ConsumerRecord<Long, String> record : records) {
        if (record.timestamp() >= end_time_Stamp) {
            reachedEnd = true;
            break;
        }
        result.add(record);
    }

    if (reachedEnd) break;
    if (records == null || records.isEmpty()) break; // dont wait for records
}

在轮询循环之前,我们通过使用“offsetsForTimes”API查找偏移量来寻求开始时间戳。我们得到记录,直到我们到达结束时间戳。

使用consumer.poll API获取记录。如何知道消费者轮询超时应该传递的是什么?目前我们只是通过反复试验来实现,看看哪种方法有效。我认为应该有更好的方法。

问题:

  1. 如何知道可以给予consumer.poll API的理想超时值是多少?它取决于什么?它应该作为运行时参数吗?
  2. 有时需要的超时值更大。什么可以导致所需的超时突然飙升? (如果kafka中的摄取率过高,是否会影响所需的消费者轮询超时配置?)
  3. 如何放弃?当没有记录时,我们应该突破循环。如何可靠地知道如何摆脱循环而不是过早?

1 个答案:

答案 0 :(得分:1)

  1. 轮询中的超时取决于您的应用程序 - 如果可以,您可以等待更长时间的数据,但如果您需要在此期间执行某些操作,那么等待太长时间没有意义
  2. 这可能是由多种原因造成的,包括重新平衡等。
  3. 我建议你不要在记录列表为空的第一时间分解,而是将轮询定义为1000毫秒,然后计算记录列表的空白直到多少次,如果是是空的10次(10s)或类似的东西:
  4. int counter=0;
    while(true) {
       consumer.poll(1000);
       for (...) {
       }
       if (records == null || records.isEmpty()) {
         counter++;
          if (counter > 10)
             break;
       } else {
         counter = 0;
       }
    }