这是Read from ALL partitions in every instance of an application
的后续活动要实现的目标是从每个实例的主题的所有分区中读取数据。我尝试使用GlobalKtable,这应该可以解决问题。不幸的是,生产者可以在“ data_in”的两个不同分区中发布两个相似的ID。因此,当运行两个不同的实例时,GlobalKtable将被覆盖。
我的问题是,这将如何实现?是否可以防止相似的ID出现在不同的分区中?或者至少如何防止它们出现在两个不同的实例中(我听说下面的代码在第一个KStream之后重新分区主题)
请分享一些起点(思想,步骤,教程,代码段等)
代码段
private GlobalKTable<String, theDataList> globalStream() {
// KStream of records from data-in topic using String and theDataSerde deserializers
KStream<String, Data> trashStream = getBuilder().stream("data_in",Consumed.with(Serdes.String(), SerDes.theDataSerde));
// Apply an aggregation operation on the original KStream records using an intermediate representation of a KStream (KGroupedStream)
KGroupedStream<String, Data> KGS = trashStream.groupByKey();
Materialized<String, theDataList, KeyValueStore<Bytes, byte[]>> materialized = Materialized.as("agg-stream-store");
materialized = materialized.withValueSerde(SerDes.theDataDataListSerde);
// Return a KTable
KGS.aggregate(() -> new theDataList(), (key, value, aggregate) -> {
if (!value.getValideData())
aggregate.getList().removeIf((t) -> t.getTimestamp() <= value.getTimestamp());
else
aggregate.getList().add(value);
return aggregate;
}, materialized)
.to("agg_data_in");
return getBuilder().globalTable("agg_data_in");
}