【发布时间】:2019-07-05 13:08:05
【问题描述】:
我有一个有数据流的主题。我需要的是从该主题创建一个单独的主题,该主题仅具有给定键的最新值集。
我认为 KTable 的全部目的是存储给定键的最新值,而不是存储整个事件流。但是我似乎无法让它工作。运行下面的代码会生成密钥库,但该密钥库(maintopiclatest)中有一个事件流(不仅仅是最新值)。因此,如果我两次发送主题中包含 1000 条记录的请求,而不是看到 1000 条记录,我看到的是 2000 条记录。
var serializer = new KafkaSpecificRecordSerializer();
var deserializer = new KafkaSpecificRecordDeserializer();
var stream = kStreamBuilder.stream("maintopic",
Consumed.with(Serdes.String(), Serdes.serdeFrom(serializer, deserializer)));
var table = stream
.groupByKey()
.reduce((aggV, newV) -> newV, Materialized.as("maintopiclatest"));
另一个问题是,如果我想将 KTable 存储在一个新主题中,我不知道该怎么做。为了做到这一点,我似乎必须将它转回 Stream 以便我可以在其上调用“.to”。但是,其中包含整个事件流,而不仅仅是最新值。
【问题讨论】:
-
为什么不用日志压缩主题?
-
@Mukeshprajapati 这是我尝试的第一件事,但似乎 Log Compaction 也没有像宣传的那样工作。无论我如何调整与之相关的各种配置设置,它似乎都不会立即启动。而且我读到它只有在存在一定数量的数据后才会在特定条件下启动。然后我阅读了有关 KTables 的信息,这让我觉得它们正是为这种只需要给定键的最新值的场景而制作的。然而,它具有所有的历史价值。我一定是错过了什么。
标签: scala apache-kafka apache-kafka-streams spring-kafka