卡夫卡__consumer_offsets中的消息时间戳和commit_timestamp

时间:2019-06-04 09:55:53

标签: apache-kafka kafka-consumer-api

我目前正在开发部分依赖Apache Kafka(版本2.2.0)的应用程序。我要做的一件事是跟踪其他消费者提交当前偏移量的时间(更重要的是何时)。据我所知,仅使用Java客户端就无法获取已提交偏移量的关联时间戳记,因为AdminClientlistConsumerGroupOffsets方法最终会导致一个OffsetAndMetadata对象,其中不包括时间戳。因此,我只是开始阅读__consumer_offsets主题中的消息。如果有更好的方法,请告诉我。

现在,如果一个人直接读取__consumer_offsets中的消息,那么突然之间会有两个时间戳。一个是附加到实际提交消息的时间戳,另一个是commit_timestamp,它是消息内容的一部分。我首先想到的是,其中一个可能是由代理设置的,而另一个可能是由提交它的客户端设置的(此外,如果您在ZooKeeper中查看/config/topics/__consumer_offsets,它不会指定{{ 1}}消息时间戳,因此可以假定它只是使用默认时间戳。 las,通过手动更改系统时间进行的快速实验表明,两者实际上都是由代理设置的。而且,他们并不总是同意(消息的时间戳有时比LogAppendTime提前一点)。我试图深入研究Kafka代码以确切地了解正在发生的事情,但是它相当复杂,而且我对它还不够熟悉,无法快速掌握。所以这是我的问题:

  1. 即使没有明确指定,commit_timestamp中的消息时间戳为何会自动__consumer_offsets中显示?只是用于发送提交消息的生产者将时间戳记留空了吗?
  2. 为什么消息时间戳和消息中包含的LogAppendTime不一致?我似乎记得在某处读过它曾经可以显式设置commit_timestamp并由此手动控制提交的偏移量的保留。
  3. 更重要的是:是否有任何理由要使用一个?例如,如果仍然可以手动设置commit_timestamp,则使用附加到消息的时间戳会更有意义。

我知道这是一个非常具体的问题,对大多数人来说可能并不重要。但是直到现在,我始终能够通过使用Google并查看Kafka的源代码来了解后台发生了什么。然而,这个让我有些困惑。因此,任何见解都将受到赞赏。

1 个答案:

答案 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]

我的机器上没有安装您在问题中提到的特定版本,因此请在最后检查。