我有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:我查看了数据分区,看起来其中一个以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]
答案 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));
}