我有一个应用程序,它将100万个字符串预加载到一个有4个分区的主题,所以250K ea。
然后,应用程序会使用手动分配的分区激活2个阅读器:
Group Topic Pid Offset logSize Lag Owner
group1 lowercaseStrings 0 233788 250000 16212 none
group1 lowercaseStrings 1 249999 250000 1 none
group1 lowercaseStrings 2 249999 250000 1 none
group1 lowercaseStrings 3 233788 250000 16212 none
我嗡嗡地读取并从分区读取并在我读取的每个ConsumerRecord上执行consumer.commitAsync(此时没有批量提交,故意,直到我理解行为)。
我在提交异步回调中放置了一个per-topic计数器来测量它被调用的次数,总数达到100万次。
在应用程序安定下来并停止后,我使用Kafka CLI工具查看我的偏移量,我得到的结果如下:
{{1}}
请注意,其中两个中的1的滞后是巧合 - 我有时会得到不同的数字。
我观察任何传入异常的异步提交回调函数,并且没有。根据我的代码,我已经按预期调用了commitAsync 100万次。
为什么我仍然有这种滞后?可能导致这种情况的原因是什么?
答案 0 :(得分:0)
Kafka批量提取邮件。当您在消息Stream中调用next()时,可能会发生两件事: - 本地没有数据,您的消费者将在内部调用poll(),这将更新其偏移状态 - 要么有一些,你就会在本地批次中前进。
当你调用commitAsync()时,你提交你在上次poll()调用时获得的偏移量,而不是你当前在内部迭代时实际有效的偏移量。
您可以通过减少接受的批次大小(在配置中设置batch.size)来控制此行为,如果您真的想要为每条消息进行poll(),则可以降低到0。我希望这个配置下降到0,你到处都会达到0滞后(请注意,对于可扩展的使用,这会破坏你的吞吐量)。