考虑到Key / Value商店中的值,如何进行Kafka流转换(map / flatMap)?

时间:2018-06-08 12:10:00

标签: scala apache-kafka

我的任务如下:

我正在监控来自第三方测量设备的时间同步事件。这个时间同步有点不稳定所以我想检测同步何时停止并发出警报。

为此,我正在为Kafka主题生成同步事件。我有三个不同的事件:

  1. 同步请求
  2. 同步成功
  3. 同步失败,因为其他设备没有响应
  4. 那么,我想做什么:

    • 收到请求后,在一定时间后没有收到任何内容,我想发出“超时”警报
    • 收到请求后,在超时期限内,成功事件到达,如果超时后没有请求到达,我想发出“超时”
    • 当故障事件到来时,我想发出“其他设备没有响应”警报

    我目前正在设置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. 在商店中查询已处理的最后一个事件
    2. 决定是否要发出警报
    3. 使用当前收到的活动更新商店
    4. 产生警报(如果有)
    5. 那么,我如何在这里实现步骤1和3?或者我在概念上是错误的,必须以不同的方式做到这一点?

1 个答案:

答案 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