KStream-KTable连接未触发

时间:2020-06-26 19:00:28

标签: apache-kafka apache-kafka-streams ktable

我有2个主题(实际上更多,但在这里保持简单),我正在使用Streams DSL加入,一旦加入,就将数据发布到下游。

我正在主题1的顶部创建一个KTable并将其存储到一个命名的 国营商店。主题1的密钥如下所示:

{  sourceCode:"WXYZ",
    platformCode:"ABCD",
    transactionIdentifier:"012345:01:55555:12345000:1"
}

我按预期在changelog主题中看到了数据。

主题2上方有一个KStream。Topic2的键如下所示:

{  sourceCode:"WXYZ",
   platformCode:"ABCD",
   transactionIdentifier:"012345:01:55555:12345000:1"
   lineIdentifier:"1"
}

我正在重新设置密钥以及将主题2中的数据聚合并将其放入另一个命名状态存储中,因为在topic1和topic2中的数据之间存在1-Many关系。 重新输入数据密钥后,主题2中的键与主题1中的键相同。我可以看到在重新分区主题中的重新输入键数据以及在changelog主题中的聚合数据。但是,并不会触发加入。

其他关键详细信息–

  1. 所有主题中的数据均为Avro格式。
  2. 我正在使用Java / Spring Boot。
  3. 我在 commit.interval.ms cache.max.bytes.buffering 上保留了默认设置>

在这里我可能做错了什么指针吗?

编辑1:我查看了数据分区,看起来其中一个以14结尾,另一个以20结尾。我还找到了similar question

编辑2:topic1和topic2的生产者是golang应用程序。 流还原使用者具有以下配置:

partition.assignment.strategy = [类 org.apache.kafka.clients.consumer.RangeAssignor]

流使用者具有以下配置:

partition.assignment.strategy = [org.apache.kafka.streams.processor.internals.StreamsPartitionAssignor]

1 个答案:

答案 0 :(得分:0)

我在下面发布答案,以帮助其他人从此类问题中寻找必杀技。正如链接问题的评论部分所指出的,这是由于生产者应用程序引起的问题。

生产者应用程序是用 golang 编写的,因此,其哈希为 与 Java 不同,这是我使用Streams DSL来连接数据的方式。

更早之前,这就是我读取KTable的方式,该表与源主题中的分区相同:

@Bean
public KTable<MyKey, MyValue> myKTable(StreamsBuilder streamsBuilder) {
    return streamsBuilder.table(inputTopic1, Materialized.as(transactionStore));
}

我重新编写了以下代码,以获得所需的结果:

@Bean
public KTable<MyKey, MyValue> myKTable(StreamsBuilder streamsBuilder) {

    SpecificAvroSerde<MyKey> keySpecificAvroSerde = myKeySpecificAvroSerde();
    SpecificAvroSerde<MyValue> valueSpecificAvroSerde = mySpecificAvroSerde();

    streamsBuilder.stream(inputTopic1, Consumed.with(keySpecificAvroSerde, valueSpecificAvroSerde)).
            selectKey((key, value) -> new MyKey(key.get1(), key.get2(), key.get3())).
        to("dummyTopic", Produced.with(keySpecificAvroSerde, valueSpecificAvroSerde));

    return streamsBuilder.table("dummyTopic",
            Materialized.<MyKey, MyValue, KeyValueStore<Bytes, byte[]>>as("myStateStore").
                   withKeySerde(keySpecificAvroSerde).withValueSerde(valueSpecificAvroSerde));
}