【问题标题】:input record timestamp and output record timestamp is same across both source and sink topics?输入记录时间戳和输出记录时间戳在源主题和接收器主题中是否相同?
【发布时间】:2018-06-03 01:56:35
【问题描述】:

我使用处理器 API 创建 kafka 流应用程序。

这是我如何创建一个主题以将时间戳附加到所有传入消息

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

工作流正在处理来自源主题的传入消息并将其发布到接收主题。出于某种奇怪的原因,我在源主题消息和接收器主题消息中看到了相同的时间戳。 例如,消息创建时间在源主题中是 T0 ,在接收主题中也保持不变。

我需要做什么才能在接收器主题消息中看到更新的时间戳?

【问题讨论】:

  • Kafka 管道中的数据是不可变的

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢马蒂亚斯的回复 :-)。我会尝试两种方法
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多