我的任务如下:
我正在监控来自第三方测量设备的时间同步事件。这个时间同步有点不稳定所以我想检测同步何时停止并发出警报。
为此,我正在为Kafka主题生成同步事件。我有三个不同的事件:
那么,我想做什么:
我目前正在设置Kafka-Streams应用程序,我需要存储状态,以防这个应用程序崩溃(不应该,但我想确定),所以我设置了以下内容:
val builder = new StreamsBuilder
val storeBuilder = Stores.
keyValueStoreBuilder(Stores.persistentKeyValueStore("timesync-alarms"),
Serdes.String(),
logEntrySerde)
builder.addStateStore(storeBuilder)
val eventStream = builder.stream(sourceTopic, Consumed.`with`(Serdes.String(), logEntrySerde))
现在,我被困住了。我基本上认为我需要做的是在eventStream上有一个flatMap
函数,每当一个事件到来时:
那么,我如何在这里实现步骤1和3?或者我在概念上是错误的,必须以不同的方式做到这一点?
答案 0 :(得分:0)
我认为你不需要直接使用国营商店。您可以创建两个流 - 一个包含同步请求事件,第二个包含同步响应(成功,失败)并加入它们:
requestStream.outerJoin(responseStream, (leftVal, rightVal) -> ...,
JoinWindows.of(timeout), ...);
如果超时rightVal
为空。
如果要将警报发送到单独的主题,则只需过滤加入的流并将所有失败(错误响应和超时)写入主题。否则,您可以使用peek()
方法并在其中触发一些操作。这是一个简单的例子:https://github.com/djarza/football-events/blob/master/football-ui/src/main/java/org/djar/football/ui/projection/StatisticsPublisher.java