KStreams确定哪些输入记录时间戳记元数据在连接上持续存在

时间:2018-08-07 15:56:48

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

希望有人知道这一点,或者可以指出正确的方向...

我有一个通过API REST请求创建的数据主题。 REST请求中收到的字段之一是记录EventTime的时间戳。这些记录将产生给Kafka,并将EventTime设置为Record的元数据时间戳。

我还有另一个规则主题,该规则主题通过将新字段添加到接收的值中来提供增强数据主题记录的信息。

这两个主题都有用于加入的匹配键。

我的目标是在所有处理阶段中使用处理器API从数据主题保留EventTime。请注意,会有多个不同的KStreams应用程序以多种方式/步骤处理/增强该数据。

好消息是,我已经看到很多事情表明使用Kafka Streams时会保留输入记录的时间戳。

例如:

并且一直在阅读Timestamp提取器:

有关加入的更多信息:

在Streams的大部分文档中,我看到它提到“输入记录的时间戳将持续到输出记录”,但是我不清楚这在加入联接时到底是如何工作的。

我的困惑似乎是当我们加入时,我们有2个不同的输入记录,并且正在生成单个输出记录。

如何确定在联接中使用的多个输入记录之间保留哪个时间戳?

我一直在与同事讨论,并有如下几种观点

  • 加入的输入记录的最早非负时间戳是 坚持。
  • 左输入记录的时间戳被保留,例如 leftStream.join(rightStream, ...);
  • 触发连接的输入记录的时间戳(向左或向右 对)
  • 这不是确定性的,因此除非指定了生产者时间戳提取器,否则将使用挂钟时间。

其中一些具有比其他更好的论据,但我需要了解实际发生的事情...

任何帮助或建议去哪里都值得赞赏。

1 个答案:

答案 0 :(得分:1)

当前(例如,Kafka 2.0版本)尚无使用该时间戳记的公共合同,并且允许实施使用任何策略。当前的实现使用触发联接计算的记录的时间戳。

作为一种解决方法,您可以通过在联接之后添加.valueTransformer()来操纵时间戳。比较https://cwiki.apache.org/confluence/display/KAFKA/KIP-251%3A+Allow+timestamp+manipulation+in+Processor+API

即,您需要在连接之前将原始时间戳嵌入值有效载荷中,并在连接之后将其提取并设置为元数据时间戳。