Kafka抵消的实际数量是多少?

时间:2016-02-17 01:11:20

标签: apache-kafka

我想从一开始就重播Kafka主题。我运行命令来获得偏移量:

[zk: localhost:2181(CONNECTED) 56] get /kafka/consumers/foo43/offsets/statdxSolrXmlDocs/0

我得到了这个:

30024
cZxid = 0x36000000e8
ctime = Fri Feb 12 04:46:27 MST 2016
mZxid = 0x36000001ac
mtime = Fri Feb 12 05:14:49 MST 2016
pZxid = 0x36000000e8
cversion = 0
dataVersion = 6
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

30024与我在10分钟前提到的主题消息数量完全没有相似之处(这个数字是3500)

所以,我在这里反映实际消息数量的假设似乎是错误的 - 这很好 - 但是我想知道究竟是什么被计算,因为当我发出这个命令时

set /kafka/consumers/foo43/offsets/statdxSolrXmlDocs/0 1

我看到号码从30024变为1 - 如果我重新运行我的消费者微服务,我会再次获得所有3500条消息。

那么 - 卡夫卡究竟在计算什么呢?它无法准确统计消息,但如果它本身并不计算消息,重新设置为1应该不能很好地工作(我在想)

万一重要 - 我在我的微服务中使用一个简单的消费者,我确实看到这个号码在简单的消费者完成它的时候就会改变(消耗了所有可用的消息)

我应该补充一点,当我在引入这3500条消息之前运行--from-beginning命令行语句时没有消息。

1 个答案:

答案 0 :(得分:3)

基于我的黑盒测试,Kafka清楚地计算消息,而不是字节或其他深奥的东西。

在我的情况下,我一遍又一遍地重复运行相同的消息。从我所看到的,如果你"清楚"通过命令行的主题,消息的数量不会重新设置为零

我所发现的是,如果我从350024获取3500(消息数量),我会通过运行此命令得到完全相同的数字(这将获得最低的偏移量。)

bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic=statdxSolrXmlDocs --broker-list=192.168.56.3:9092  --time=-2

返回26524。

如果我通过26524进入此命令:

set /kafka/consumers/foo43/offsets/statdxSolrXmlDocs/0 26524

然后,当我运行微服务时,我再次收到所有3500条消息。

因此,简而言之,Kafka会对消息进行计数,包括自删除后的消息,但您显然可以信任它为最低偏移量返回的数字。

为了测试这一点,我从Zookeeper中擦除了所有内容,重新安装了Kafka,并将所有消息重新发送到Kafka。在这种情况下,我的最低偏移量为0,我的最高值是我发送的消息数量。

有一次,我在Kafka邮件列表上得到了一个答案,即偏移量是字节而不是消息,但我不知道这是正确的答案,因为我的消息大小不一样所以字节数不能解释观察到的结果。

作为最后一点,我发现如果我在上面的set命令中传入0,它仍然有效。我假设Kafka去寻找0,然后是1,然后是2,依此类推,直到它在26524发现了一条实际的消息。因此,如果你真的想要从头开始的一切,那么完全准确的开始偏移似乎并不重要。