Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡流:将历史数据与流连接_Java_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

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生成的事件的输出主题
目标:来自主题b的消息需要使用存储在主题a中的事件进行充实,然后发布在主题c上

问题:我无法直接加入主题,因为主题a包含许多重复项,我需要在主题a和主题b之间精确地进行1:1匹配

想法1

  • 从主题a-聚合事件创建
    KTable
    aTable
问题:这可能会起作用,但在AIK中,
KTable
aTable创建的状态存储和底层主题将无限增长

想法2

  • 使用窗口:
我也可以通过将stream-b变成一个窗口化的
KTable
来加入,但我不确定我是否喜欢这种方法,因为它将创建另一个(这次不需要)主题

想法3

通过以下方式手动执行操作:

  • 创建具有30天保留期的新压缩主题(主题-d)
  • 创建一个新拓扑,将所有消息从主题a推送到主题d
  • 将topic-b中的所有值与topic-d连接起来-直接连接蒸汽,而不使用任何
    KTable
    s 虽然有一些开销,但我认为这可能会起作用,不过我觉得我是通过某种方式传递框架的
所以最后我的问题是:使用kafka streams实现历史数据与流连接的最佳方式是什么?虽然想法2可能奏效,但我认为想法3是最好的 更好的方法,因为它只需要一个附加主题,不需要状态存储

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