我可以在peek、filter或kafka流应用的分支中执行一些有状态操作吗?

我可以在peek、filter或kafka流应用的分支中执行一些有状态操作吗?,filter,apache-kafka,apache-kafka-streams,stateful,Filter,Apache Kafka,Apache Kafka Streams,Stateful,正如我们在kafka stream doc中所知道的,peek、filter、branch是无状态操作吗? 但是,我想在这个处理器中执行一些有状态的操作? 例如,我想做一些查询,并根据结果过滤消息,我可以这样做吗 IMO,最好的方法是使用KStream#…join或使用访问底层状态存储(使用KStream#transformValues) 您可以这样做,但代码将非常糟糕(不建议这样做),但您只能在流状态从重新平衡移动到运行后获得对ReadOnlyKeyValueStore的只读访问: kafka

正如我们在kafka stream doc中所知道的,peek、filter、branch是无状态操作吗? 但是,我想在这个处理器中执行一些有状态的操作?
例如,我想做一些查询,并根据结果过滤消息,我可以这样做吗

IMO,最好的方法是使用
KStream#…join
或使用访问底层状态存储(使用
KStream#transformValues

您可以这样做,但代码将非常糟糕(不建议这样做),但您只能在流状态从重新平衡移动到运行后获得对
ReadOnlyKeyValueStore
的只读访问:

kafkaStreams.setStateListener((newState, oldState) -> {
    if (newState == KafkaStreams.State.RUNNING && oldState == KafkaStreams.State.REBALANCING) {
        ReadOnlyKeyValueStore<Object, Object> kvStore = kafkaStreams.store("stateStore", QueryableStoreTypes.keyValueStore());
        //assign this kvStore to some place so you can later using this referrer access this in filter or in peek
    }
});
kafkaStreams.setStateListener((newState,oldState)->{
if(newState==KafkaStreams.State.RUNNING&&oldState==KafkaStreams.State.rebalance){
ReadOnlyKeyValueStore kvStore=kafkaStreams.store(“stateStore”,QueryableStoreTypes.keyValueStore());
//将此kvStore分配到某个位置,以便您以后可以使用此推荐人在筛选器或peek中访问此内容
}
});
操作
peek()
filter()
branch()
本质上是无状态的。当你说:

我想做一些查询,并根据结果过滤消息

这取决于你想查询什么?可以(但不建议)查询“外部”API。然而,没有内置的支持,并且有许多角落的情况下考虑,使其稳健。请注意,查询外部系统不会使操作有状态

如果要使用状态,可以使用
transform()
(和同级)并生成自定义运算符。如果命名所有下游运算符(通过
命名
和类似方式),则可以使用
context.forward(…),To.child(…)
实现自定义分支。对于筛选,您可以返回
null
以不转发任何内容

不确定有状态的peek()将用于什么,但您也可以这样做


根据用例的不同,还可以通过流表联接或流全局表联接实现“有状态筛选器”。

KStream#transformValues或KStream#transform?b因为后者可以返回null,从而终止转发消息,这就是筛选器功能@zydzjy是的,当你像你说的那样返回null KeyValue时,KStream#transform也会起到过滤器的作用,但是要注意,KStream#transform会标记数据重新分区,当你调用join、groupByKey等操作符时会被触发。使用“交互式查询”听起来不像是一个有效的解决方案。是的,优雅的解决方案仍然使用处理器API或表lookup@TuyenLuong那么如何使用transformValues作为过滤函数呢?谢谢