我有一个文档流,它经过多个处理步骤。这些步骤是并行完成的。每个步骤完成后,将向stage completion
主题发送一条消息。完成所有步骤后,跟踪器会向文档processing complete
的{{1}}主题发送消息。
我在跟踪器中使用kafka流(顶部有春季云流)来实现上述功能。
以下是示例代码。
Id
发布完成消息后,需要清理该文档 @StreamListener
@SendTo("processingComplete")
public KStream<String, String> onCompletion(@Input("stageCompletion")
KStream<String, String> stageCompletionStream) {
return stageCompletionStream
.filter(this::checkValidity)
.groupByKey(Serialized.with(Serdes.String(), Serdes.String()))
.reduce(this::aggregateStageCompletion,
Materialized.as("stage_completion_store"))
.toStream()
.filter((ignored, message) -> checkCompletion(message))
.map(this::publishCompletion);
}
的状态存储-stage_completion_store
(默认情况下恰好是rock db)。
建议的方法是插入一个墓碑消息;为此,我还实现了另一个流来读取Id
主题并将其与processing complete
流合并。
以下是使用此方法的代码。
stage completion
当消息是处理完成消息时, @StreamListener
@SendTo("processingComplete")
public KStream<String, String> onCompletion(@Input("stageCompletion")
KStream<String, String>
stageCompletionStream,@Input("processingCompleteFeed") KStream<String,
String> processingCompletionStream){
return processingCompletionStream.merge(stageCompletionStream)
.filter(this::checkValidity)
.groupByKey(Serialized.with(Serdes.String(),Serdes.String()))
.reduce(this::aggregateStageCompletion,
Materialized.as("stage_completion_store"))
.toStream()
.filter((ignored,message)->checkCompletion(message))
.map(this::publishCompletion);
}
插入墓碑(返回aggregateStageCompletion
)。
这是否是一种好方法-读取流只是为了标记墓碑?还是有更好的方法来达到相同的目的?