为什么我的所有Kafka提交都没有实际提交? (0.9.0.1)

时间:2016-04-06 19:41:53

标签: apache-kafka

我有一个应用程序,它将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万次。

为什么我仍然有这种滞后?可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:0)

Kafka批量提取邮件。当您在消息Stream中调用next()时,可能会发生两件事:   - 本地没有数据,您的消费者将在内部调用poll(),这将更新其偏移状态   - 要么有一些,你就会在本地批次中前进。

当你调用commitAsync()时,你提交你在上次poll()调用时获得的偏移量,而不是你当前在内部迭代时实际有效的偏移量。

您可以通过减少接受的批次大小(在配置中设置batch.size)来控制此行为,如果您真的想要为每条消息进行poll(),则可以降低到0。我希望这个配置下降到0,你到处都会达到0滞后(请注意,对于可扩展的使用,这会破坏你的吞吐量)。