我想从一开始就重播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命令行语句时没有消息。
答案 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发现了一条实际的消息。因此,如果你真的想要从头开始的一切,那么完全准确的开始偏移似乎并不重要。