Java 卡夫卡0.9新的消费者api——如何观看消费者补偿

Java 卡夫卡0.9新的消费者api——如何观看消费者补偿,java,kafka-consumer-api,Java,Kafka Consumer Api,我试图用JavaAPI监控给定组的使用者偏移量。我创建了一个额外的消费者,它不订阅任何主题,只调用consumer.committed(topic)来获取偏移量信息。这是一种工作,但是: 对于测试,我只使用一个真正的消费者(即订阅主题的消费者)。当我使用close()关闭它,然后重新启动它时,尽管我使用poll(1000),但从订阅到第一次使用消息需要27秒 我猜这与重新平衡可能被未订阅的消费者混淆有关。这可能吗?是否有更好的方法使用Java API监控偏移量(我知道命令行工具,但需要使用API

我试图用JavaAPI监控给定组的使用者偏移量。我创建了一个额外的消费者,它不订阅任何主题,只调用
consumer.committed(topic)
来获取偏移量信息。这是一种工作,但是:

对于测试,我只使用一个真正的消费者(即订阅主题的消费者)。当我使用
close()
关闭它,然后重新启动它时,尽管我使用
poll(1000)
,但从订阅到第一次使用消息需要27秒


我猜这与重新平衡可能被未订阅的消费者混淆有关。这可能吗?是否有更好的方法使用Java API监控偏移量(我知道命令行工具,但需要使用API)。

根据主题检查偏移量有不同的方法,这取决于您想要它的目的,除了上面描述的“提交”之外,还有两个选项:

1) 如果您想知道消费者在下次线程启动时开始从代理获取数据的偏移量id,那么必须使用“位置”作为

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());
}
Iterator it=kafkaConsumer.poll(1000.Iterator();
while(it.hasNext()){
ConsumerRecord record=it.next();
System.out.println(“偏移量:+record.offset());
}

发现了:监控消费者加剧了混乱,但不是罪魁祸首。最后,这很容易理解,尽管有点出乎意料(至少对我来说):

session.timeout.ms
的默认值为30秒。当消费者消失时,需要30秒才能宣布其死亡并重新平衡工作。为了进行测试,我停止了我拥有的单个消费者,等待了三秒钟,然后重新启动了一个新的消费者。然后,这需要27秒才能开始,填补了30秒的超时时间

我本以为,一个单独的消费者创业不会等到超时期满,而是开始“重新平衡”,即立即抢占工作。看起来,即使只有一个消费者,在重新平衡工作之前,暂停时间也必须到期

为了更快地完成测试,我更改了配置,为消费者使用较低的
session.timeout.ms
,为代理使用较低的
group.min.session.timeout.ms


总结:使用不订阅任何主题的消费者来监控补偿效果很好,并且似乎不会干扰再平衡过程。

这两种方法仅适用于订阅的消费者。关键是我有一个消费者需要监控。它不会参与消费,因此不能使用这些方法。
Iterator<ConsumerRecord<byte[],byte[]>> it = kafkaConsumer.poll(1000).iterator();
while(it.hasNext()){
ConsumerRecord<byte[],byte[]> record = it.next();
System.out.println("offset : " + record.offset());
}