Java 卡夫卡流:将历史数据与流连接
鉴于我有以下三个主题:Java 卡夫卡流:将历史数据与流连接,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,鉴于我有以下三个主题: 主题-a:事件连续生成-主题已分区但未压缩-以前的消息更新很常见 主题b:事件每月发生一次-主题已分区但未压缩-事件与主题a中的事件相关-主题a中的所有键将在此主题中引用 主题c:通过合并a和b生成的事件的输出主题 目标:来自主题b的消息需要使用存储在主题a中的事件进行充实,然后发布在主题c上 问题:我无法直接加入主题,因为主题a包含许多重复项,我需要在主题a和主题b之间精确地进行1:1匹配 想法1 从主题a-聚合事件创建KTableaTable 问题:这可能会起
- 主题-a:事件连续生成-主题已分区但未压缩-以前的消息更新很常见
- 主题b:事件每月发生一次-主题已分区但未压缩-事件与主题a中的事件相关-主题a中的所有键将在此主题中引用
- 主题c:通过合并a和b生成的事件的输出主题
- 从主题a-聚合事件创建
aTableKTable
KTable
aTable创建的状态存储和底层主题将无限增长
想法2:
- 使用窗口:
KTable
来加入,但我不确定我是否喜欢这种方法,因为它将创建另一个(这次不需要)主题
想法3:
通过以下方式手动执行操作:
- 创建具有30天保留期的新压缩主题(主题-d)
- 创建一个新拓扑,将所有消息从主题a推送到主题d
- 将topic-b中的所有值与topic-d连接起来-直接连接蒸汽,而不使用任何
s 虽然有一些开销,但我认为这可能会起作用,不过我觉得我是通过某种方式传递框架的KTable
KStream<String, DomainObjectA> aStream = kStreamBuilder.stream(
aTopic,
Consumed.with(Serdes.String(), aSerde));
KTable<String, DomainObjectA> aTable = aStream
.groupByKey()
.reduce(
(value1, value2) -> value2
);
KStream<String, DomainObjectB> bStream = kStreamBuilder.stream(topicB);
KStream<String, DomainObjectC> cStream = bStream.leftJoin(aTable, getJoiner())
KStream<String, DomainObjectA> aStream = kStreamBuilder.stream(
aTopic,
Consumed.with(Serdes.String(), aSerde));
KTable<Windowed<String>, DomainObjectA> aTable = aStream
.groupByKey()
.windowedBy(TimeWindows.of(Duration.ofDays(30L)))
.reduce(
(value1, value2) -> value2,
Materialized.<String, DomainObjectA, WindowStore<Bytes, byte[]>>as("a-storage").withRetention(Duration.ofDays(30L)));
KStream<String, DomainObjectB> bStream = kStreamBuilder.stream(topicB);
KStream<String, DomainObjectC> cStream = bStream.leftJoin(aTable, getJoiner()); // not possible