消耗关于Kafka主题的所有消息并断开连接

时间:2017-09-16 04:43:40

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

我有一个批处理作业,每天会触发一次。要求是

  1. 消耗当时Kafka主题上可用的所有消息
  2. 处理消息
  3. 如果流程成功完成,请提交抵消。
  4. 目前我在while循环中poll()消息,直到ConsumerRecords.isEmpty()为true。当ConsumerRecords.isEmpty()为true时,我假设已经消耗了Topic上可用的所有记录。该应用程序维护抵消并关闭卡夫卡消费者。

    当消息处理完成并成功完成后,我创建了一个新的KafkaConsumer并提交了应用程序维护的偏移量。

    注意我关闭最初用于读取消息的KafkaConsumer,并使用另一个KafkaConsumer实例提交偏移量以避免消费者重新平衡异常。

    我期待主题上最多5k条消息。该主题已分区并复制。

    有没有更好的方法在特定时间点消费主题上的所有消息?我有什么遗失或需要照顾的吗?我不认为我需要处理消费者重新平衡,因为我在循环中对poll()进行轮询并在轮询完成后处理消息。

    我正在使用java kafka客户端v0.9,如果在上述场景中有帮助,可以更改为v0.10。

    由于

    更新:

    AtomicBoolean flag = new AtomicBoolean();
    flag.set(true);
    
    while(flag.get()) {
    
     ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(timeout);
    
     if(consumerRecords.isEmpty()) {
         flag.set(false);
         continue;
     }
      //if the ConsumerRecords is not empty process the messages and continue to poll()
    }
    kafkaConsumer.close();
    

1 个答案:

答案 0 :(得分:0)

您不能假设在调用poll()之后,由于使用者的max.poll.records配置参数,您已阅读该时刻主题中可用的所有消息。这是单个poll()返回的最大记录数,其默认值为500.这意味着如果在该时刻主题中有600条消息,则需要在poll()上进行两次调用以读取所有消息(但考虑到其他一些消息可能会到达)。 我不明白的另一件事是为什么你使用不同的消费者来提供补偿。您正在谈论的消费者再平衡异常是什么?