Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 卡夫卡'中的消息时间戳和提交时间戳;消费者补偿_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Apache kafka 卡夫卡'中的消息时间戳和提交时间戳;消费者补偿

Apache kafka 卡夫卡'中的消息时间戳和提交时间戳;消费者补偿,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我目前正在开发一个部分依赖ApacheKafka(版本2.2.0)的应用程序。我必须做的一件事是跟踪其他消费者提交当前补偿的内容(更重要的是何时提交)。据我所知,仅使用Java客户端无法获取提交的偏移量的相关时间戳,因为的方法最终会导致一个不包含时间戳的对象。因此,我只是开始阅读\u消费者偏移量主题中的消息。如果有更好的方法,请告诉我 现在,如果一个人直接读取\u消费者偏移量中的消息,那么一个人突然有两个时间戳。一个是附加到实际提交消息的时间戳,另一个是commit\u时间戳,它是消息内容的一部

我目前正在开发一个部分依赖ApacheKafka(版本2.2.0)的应用程序。我必须做的一件事是跟踪其他消费者提交当前补偿的内容(更重要的是何时提交)。据我所知,仅使用Java客户端无法获取提交的偏移量的相关时间戳,因为的方法最终会导致一个不包含时间戳的对象。因此,我只是开始阅读
\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
    主题。