如何使用selectKey将逻辑删除事件委托给KTable

时间:2019-03-04 09:16:57

标签: apache-kafka-streams

我具有以下kafka流配置。

StreamBuilder builder = stream("TopicA", Serdes.String(), new 
        SpecificAvroSerde<TestObject>())
    .filter((key, value) -> value!=null)
    .selectKey((key, value) -> value.getSomeProperty())
    .groupByKey(Grouped.with(Serdes.Long(), new 
        SpecificAvroSerde<TestObject>()))
    .reduce((oldValue, newValue) -> newValue), 
        Materialized.as("someStore"));

这按预期工作,但我想不出如何处理TestObject的Tombstone消息,即使删除也是如此

.filter((key, value) -> value!=null)

当值到达null时,我无法弄清楚如何处理'selectKey'。当value也为null时,我无法使用'value.getSomeProperty()'发送逻辑删除消息。 >

您将如何处理此问题?

1 个答案:

答案 0 :(得分:0)

您可以使用transform()代替selectKey()并将旧的<key,value>对存储在状态存储中。这样,在处理<key,null>时,您可以从存储中获取先前的值,并获取先前提取的新密钥并发送相应的逻辑删除。

但是,reduce()无法处理具有null键或null值的记录(那些记录将被删除)。因此,您将需要使用替代值而不是null来将记录放入Reduce函数中。如果收到代理,Reduce可以返回null