如何仅在kafka主题中存储最新的键值

时间:2019-02-11 23:36:51

标签: scala apache-kafka apache-kafka-streams spring-kafka

我有一个主题,其中涉及数据流。我需要从该主题创建一个单独的主题,该主题仅具有给定键的最新值集。

我认为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”。但这不仅包含最新值,而且还包含所有事件。

1 个答案:

答案 0 :(得分:1)

这不是KTable的工作方式。

KTable本身具有内部状态存储,并且每个键仅存储一个记录。但是,KTable会不断更新,并受所谓的 stream-table-duality 的约束。对KTable的每次更新都作为更改日志记录https://docs.confluent.io/current/streams/concepts.html#duality-of-streams-and-tables向下游发送。因此,每个输入记录都会生成一个输出记录。

因为是流处理,所以没有“每个值的最后一个键”。

  

我有一个主题,其中涉及数据流。我需要从该主题创建一个单独的主题,该主题仅具有给定键的最新值集。

您希望KTable在哪个时间点发出更新?这个问题没有答案,因为输入流在概念上是无限的。