Apache kafka 卡夫卡'中的消息时间戳和提交时间戳;消费者补偿
我目前正在开发一个部分依赖ApacheKafka(版本2.2.0)的应用程序。我必须做的一件事是跟踪其他消费者提交当前补偿的内容(更重要的是何时提交)。据我所知,仅使用Java客户端无法获取提交的偏移量的相关时间戳,因为的方法最终会导致一个不包含时间戳的对象。因此,我只是开始阅读Apache kafka 卡夫卡'中的消息时间戳和提交时间戳;消费者补偿,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我目前正在开发一个部分依赖ApacheKafka(版本2.2.0)的应用程序。我必须做的一件事是跟踪其他消费者提交当前补偿的内容(更重要的是何时提交)。据我所知,仅使用Java客户端无法获取提交的偏移量的相关时间戳,因为的方法最终会导致一个不包含时间戳的对象。因此,我只是开始阅读\u消费者偏移量主题中的消息。如果有更好的方法,请告诉我 现在,如果一个人直接读取\u消费者偏移量中的消息,那么一个人突然有两个时间戳。一个是附加到实际提交消息的时间戳,另一个是commit\u时间戳,它是消息内容的一部
\u消费者偏移量
主题中的消息。如果有更好的方法,请告诉我
现在,如果一个人直接读取\u消费者偏移量
中的消息,那么一个人突然有两个时间戳。一个是附加到实际提交消息的时间戳,另一个是commit\u时间戳
,它是消息内容的一部分。我的第一个想法是,其中一个可能是由代理设置的,另一个可能是由提交它的客户机设置的(另外,如果您查看ZooKeeper中的/config/topics/\uu consumer\u offset
,它没有指定LogAppendTime
消息时间戳,因此可以假设它只使用默认值)。唉,一个手动切换系统时间的快速实验表明,两者实际上都是由代理设置的。更重要的是,他们并不总是同意(消息的时间戳有时略早于commit\u时间戳
)。我曾试图深入了解卡夫卡的代码,以准确了解发生了什么,但它相当复杂,我对它不够熟悉,无法很快掌握。下面是我的问题:
\uu consumer\u offset
中的消息时间戳会自动LogAppendTime
,即使没有明确指定?是否只是用于发送提交消息的生产者将时间戳留空commit\u时间戳
,从而手动控制提交偏移量的保留commit\u时间戳
,那么使用附加到消息的时间戳会更有意义我知道这是一个非常具体的问题,对大多数人来说可能并不重要。但直到现在,通过使用谷歌和查看卡夫卡的源代码,我始终能够理解背景中发生了什么;然而,这件事让我有点困惑。因此,非常感谢您的任何见解。我认为后一个时间戳是到期时间。 你能试试下面的内容吗 通过在
consumer.config
中设置参数“exclude.internal.topics=false”
来设置可访问的内部主题
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]
我的机器上没有安装您在问题中提到的特定版本,因此请检查。偏移元数据可以包含您想要的任何内容。事实上,这是Confluent Replicator用于确保灾难中消费者故障切换的一部分scenarios@cricket_007啊,说得好。但是,在元数据中,我只能包含客户端时间戳。我在这里感兴趣的(以及我提到的两个时间戳所提供的)是代理端时间戳。我没有花太多时间查看消费者偏移量消息生成,但我个人不知道能够显式设置时间。不过,这些消息仍然是通过ProducerRecord生成的,并且是由客户机生成的(我相信是消费者组协调员),因此它不完全是“代理时间戳”@cricket_007非常感谢您的见解。首先,消费者小组协调员不是经纪人吗(与小组负责人形成对比)?消息当然是由客户端创建的,但时间戳似乎是由代理生成的。为了测试这一点,我运行了一个卡夫卡代理,系统时间被移动了5秒,这也是我在获得的时间戳中看到的。手动设置时间戳似乎是卡夫卡协议的一部分。所以你说你在使用Kafka 2.2,但是那些文档说偏移提交请求的时间戳从0.9开始就被删除了。。。我读对了吗?谢谢你的回答。我想你可能用的是卡夫卡的旧版本。正如您在(第950-974行)中所看到的,过期时间过去一直存在,但现在不再存在了。在我的例子中,它只是报告为
None
。我说的是消息本身的时间戳。通常,您可以通过将--property print.timestamp=true
传递给控制台使用者来看到这一点,但无论出于何种原因,它都不适用于我的机器上的\uuuuu consumer\u offset
主题。