我正在尝试使用Java API监视给定组的使用者偏移量。我创建了一个不订阅任何主题的额外消费者,但只是调用consumer.committed(topic)
来获取偏移信息。这种作品,但是:
为了进行测试,我只使用一个真正的消费者(即订阅该主题的消费者)。当我使用close()
将其关闭并稍后重新启动时,订阅和第一次消息之间需要27秒,尽管我使用poll(1000)
。
我猜这与重新平衡有关,可能会被非订阅消费者混淆。这有可能吗?有没有更好的方法来监控Java API的偏移(我知道命令行工具,但需要使用API)。
答案 0 :(得分:1)
有多种方法可以检查主题的偏移量,取决于您想要的目的,除了上面描述的“已提交”之外,还有两个选项:
1)如果你想知道消费者下次开始从经纪人那里获取数据的偏移id,那么你必须使用“position”作为
long offsetPosition;
TopicPartition tPartition = new TopicPartition(topic,partitionToReview);
offsetPosition = kafkaConsumer.position(tPartition);
System.out.println("offset of the next record to fetch is : " + position);
2)从kafkaConsumer执行民意调查后,从ConsumerRecord对象调用“offset()”方法
Iterator<ConsumerRecord<byte[],byte[]>> it = kafkaConsumer.poll(1000).iterator();
while(it.hasNext()){
ConsumerRecord<byte[],byte[]> record = it.next();
System.out.println("offset : " + record.offset());
}
答案 1 :(得分:1)
找到它:监控消费者增加了混乱,但不是罪魁祸首。最后,虽然略有意外(至少对我来说)很容易理解:
session.timeout.ms
的默认值为30秒。当消费者消失时,它需要最多30秒才能宣告死亡并重新平衡工作。为了测试,我已经停止了我的单个消费者,等了三秒钟并重新启动了一个新消费者。然后在开始之前花了27秒,填充30秒超时。
我原本预计单个,单独的消费者启动不会等待超时到期,而是开始“重新平衡”,即立即抓住工作。看来,即使只有一个消费者,在工作重新平衡之前,超时也必须到期。
为了让测试更快地通过,我更改了配置,为消费者使用较低的session.timeout.ms
,为代理使用group.min.session.timeout.ms
。
总结一下:使用不订阅任何主题来监控偏移的消费者可以正常工作并且似乎不会干扰重新平衡过程。