首页 文章

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

提问于
浏览
1

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

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

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

这两个主题都具有匹配的加入键 .

我的目标是使用处理器API在所有处理阶段保留EventTime与数据主题 . 请注意,将有多个不同的KStream应用程序以多种方式/步骤处理/扩充此数据 .

好消息是我看到很多东西表明在使用Kafka Streams时保留了输入记录时间戳 .

如:

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

更多关于加入:

在大多数Streams文档中,我看到它提到“输入记录的时间戳将持续到输出记录”但我不清楚这在连接时是如何工作的 .

我的困惑似乎是,当我们加入时,我们有两个不同的输入记录,并产生一个输出记录 .

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

我一直在与同事讨论这个问题,并且有以下几种观点

  • 已连接的输入记录的最早非负时间戳是持久的 .

  • 左输入记录的时间戳保持不变,例如 leftStream.join(rightStream, ...);

  • 触发连接的输入记录的时间戳(左或右)

  • 这是非确定性的,因此除非为 生产环境 者指定了时间戳提取器,否则将使用挂钟时间 .

其中一些比其他人有更好的论据,但我需要知道实际发生了什么......

任何有关在哪里寻求帮助或建议表示赞赏 .

1 回答

  • 1

    目前(即Kafka 2.0发布)没有公共 Contract 将使用哪个时间戳,并允许实施使用任何策略 . 当前实现使用触发连接计算的记录的时间戳 .

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

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

相关问题