源和汇主题的输入记录时间戳和输出记录时间戳是否相同?

时间:2017-12-20 13:29:51

标签: java apache-kafka apache-kafka-streams

我使用Processor API创建kafka流应用程序。

以下是我创建主题以将时间戳附加到所有传入消息的方法

  

kafka-topics.sh --create --zookeeper localhost:2181   --replication-factor 1 --partitions 1 - topic topicName --config message.timestamp.type = CreateTime

工作流正在处理来自源主题的传入消息并将其发布到sink主题。出于某种奇怪的原因,我在源和宿主题消息中看到了相同的时间戳。 比如说,在消息的源主题中创建时间是 T0 ,在sink主题中也是如此。

我需要做些什么来查看sink主题消息中的更新时间戳?

1 个答案:

答案 0 :(得分:0)

如果您使用CreateTime配置主题,则时间戳存储将是生产者提供的时间戳。

对于普通KafkaProducer,您没有明确指定时间戳,KafkaProducer使用System.currentTimeMillis()并将消息发送给代理。

对于Kafka Streams,如果您读取具有特定时间戳的输入记录,我们将专用时间戳推理逻辑来计算结果记录的时间戳。因此,Kafka Streams在将其交给内部使用的KafkaProducer时显式设置时间戳,因此生产者只使用此时间戳并且不使用当前的挂钟时间。对于流处理,这通常是期望的行为。

如果您有一个简单的管道只将数据从一个主题复制到另一个主题,则时间戳推断将使用输入记录时间戳作为输出记录时间戳。

你可以做两件事来获得不同的语义:

  1. 为您的Kafka Streams应用程序配置WallClockTimestampExtractor。对于这种情况,Kafka Stream不会使用嵌入式记录时间戳,而是使用当前的挂钟时间来获取输出记录的时间戳。
  2. 使用AppendTime而不是CreateTime配置输出主题。对于这种情况,代理总是用当前代理挂钟时间覆盖生产者提供的记录时间戳。