我目前正在开发部分依赖Apache Kafka(版本2.2.0)的应用程序。我要做的一件事是跟踪其他消费者提交当前偏移量的时间(更重要的是何时)。据我所知,仅使用Java客户端就无法获取已提交偏移量的关联时间戳记,因为AdminClient
的listConsumerGroupOffsets
方法最终会导致一个OffsetAndMetadata
对象,其中不包括时间戳。因此,我只是开始阅读__consumer_offsets
主题中的消息。如果有更好的方法,请告诉我。
现在,如果一个人直接读取__consumer_offsets
中的消息,那么突然之间会有两个时间戳。一个是附加到实际提交消息的时间戳,另一个是commit_timestamp
,它是消息内容的一部分。我首先想到的是,其中一个可能是由代理设置的,而另一个可能是由提交它的客户端设置的(此外,如果您在ZooKeeper中查看/config/topics/__consumer_offsets
,它不会指定{{ 1}}消息时间戳,因此可以假定它只是使用默认时间戳。 las,通过手动更改系统时间进行的快速实验表明,两者实际上都是由代理设置的。而且,他们并不总是同意(消息的时间戳有时比LogAppendTime
提前一点)。我试图深入研究Kafka代码以确切地了解正在发生的事情,但是它相当复杂,而且我对它还不够熟悉,无法快速掌握。所以这是我的问题:
commit_timestamp
中的消息时间戳为何会自动__consumer_offsets
中显示?只是用于发送提交消息的生产者将时间戳记留空了吗?LogAppendTime
不一致?我似乎记得在某处读过它曾经可以显式设置commit_timestamp
并由此手动控制提交的偏移量的保留。commit_timestamp
,则使用附加到消息的时间戳会更有意义。我知道这是一个非常具体的问题,对大多数人来说可能并不重要。但是直到现在,我始终能够通过使用Google并查看Kafka的源代码来了解后台发生了什么。然而,这个让我有些困惑。因此,任何见解都将受到赞赏。
答案 0 :(得分:0)
我认为后面的时间戳是到期时间。 您可以尝试按照以下步骤进行操作吗?
通过在"exclude.internal.topics=false"
中设置参数consumer.config
来设置可访问的内部主题。
bin/kafka-console-consumer.sh --consumer.config /tmp/consumer.config \
--bootstrap-server localhost:9092 \
--topic __consumer_offsets
我可以看到如下结果:
[mygroup1,mytopic1,11]::[OffsetMetadata[55166421,NO_METADATA],CommitTime 1502060076305,ExpirationTime 1502146476305]
[mygroup1,mytopic1,13]::[OffsetMetadata[55037927,NO_METADATA],CommitTime 1502060076305,ExpirationTime 1502146476305]
[mygroup2,mytopic2,0]::[OffsetMetadata[126,NO_METADATA],CommitTime 1502060076343,ExpirationTime 1502146476343]
我的机器上没有安装您在问题中提到的特定版本,因此请在最后检查。