使用 Kafka Streams 加入不同的主题?

Joining separate topics with Kafka Streams?


在我当前的项目中,我们使用 Kafka、Kafka Connect、Elasticsearch 创建了一个数据管道。数据以主题 "signal-topic" 结束,并且不符合形式

KeyValue<id:String, obj:Signal>

现在我正在尝试引入 Kafka Streams,以便能够对从 Kafka 到 Elasticsearch 的数据进行一些处理。

我的第一个目标是能够使用不同类型的辅助信息来增强数据。一个典型的场景是根据数据中已经存在的一些信息将另一个字段附加到数据。例如,数据包含一个 "rawevent" 字段,基于此我想添加一个 "event-description",然后输出到不同的主题。

实施此 "correct" 的方法是什么?

我正在考虑将辅助数据放在一个单独的 kafka 中的主题

KeyValue<rawEvent:String, eventDesc:String>

并让流加入这两个主题,但我不确定如何实现。
这可能吗?我遇到的所有示例似乎都要求数据源的键是相同的,因为我的不是,所以我不确定它是否可能。 如果有人有关于如何做到这一点的片段,那就太好了。

提前致谢。

你有两种可能:

  1. 您可以从 Signal 中提取 rawEvent 并设置为新的键以对 KTable<rawEvent:String, eventDesc:String> 进行连接。类似于 KStream#selectKey(...)#join(KTable...)
  2. 您可以执行 KStream-GlobalKTable 连接:这允许从用于执行 GlobalKTable 查找以计算连接的 KStream(在您的情况下 rawEvent)中提取非键连接属性。

Note, that both joins do provide different semantics as a KStream-KTable join is synchronized on time, while a KStream-GlobalKTable join is not synchronized. Check out this blog post for more details: https://www.confluent.io/blog/crossing-streams-joins-apache-kafka/