Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Kafka streams:groupByKey和reduce在流中发生错误时不触发操作一次_Kotlin_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Kotlin Kafka streams:groupByKey和reduce在流中发生错误时不触发操作一次

Kotlin Kafka streams:groupByKey和reduce在流中发生错误时不触发操作一次,kotlin,apache-kafka,apache-kafka-streams,Kotlin,Apache Kafka,Apache Kafka Streams,我有一个简单的Kafka streams场景,其中我在做一个groupyByKey然后reduce然后是一个动作。源主题中可能存在重复事件,因此groupyByKey和reduce 该操作可能会出错,在这种情况下,我需要streams应用程序重新处理该事件。在下面的例子中,我总是抛出一个错误来证明这一点 非常重要的是,这种行为只发生一次,而且至少发生一次 我发现的问题是,当streams应用程序重新处理事件时,reduce函数正在被调用,当它返回null时,操作不会被调用。 由于源主题topic

我有一个简单的Kafka streams场景,其中我在做一个
groupyByKey
然后
reduce
然后是一个动作。源主题中可能存在重复事件,因此
groupyByKey
reduce
该操作可能会出错,在这种情况下,我需要streams应用程序重新处理该事件。在下面的例子中,我总是抛出一个错误来证明这一点

非常重要的是,这种行为只发生一次,而且至少发生一次

我发现的问题是,当streams应用程序重新处理事件时,reduce函数正在被调用,当它返回
null
时,操作不会被调用。 由于源主题
topic\u NAME
只生成一个事件,我希望reduce没有任何值,并跳到
mapValues

val topologyBuilder = StreamsBuilder()

    topologyBuilder.stream(
        TOPIC_NAME,
        Consumed.with(Serdes.String(), EventSerde())
    )
        .groupByKey(Grouped.with(Serdes.String(), EventSerde()))
        .reduce { current, _ ->
            println("reduce hit")
            null
        }
        .mapValues { _, v ->
            println(Id: "${v.correlationId}")
            throw Exception("simulate error")
        }
为了解决这个问题,我运行了两次streams应用程序。这是输出:

第一次跑步

Id: 90e6aefb-8763-4861-8d82-1304a6b5654e
11:10:52.320 [test-app-dcea4eb1-a58f-4a30-905f-46dad446b31e-StreamThread-1] ERROR org.apache.kafka.streams.KafkaStreams - stream-client [test-app-dcea4eb1-a58f-4a30-905f-46dad446b31e] All stream threads have died. The instance will be in error state and should be closed.
reduce hit
第二次跑步

Id: 90e6aefb-8763-4861-8d82-1304a6b5654e
11:10:52.320 [test-app-dcea4eb1-a58f-4a30-905f-46dad446b31e-StreamThread-1] ERROR org.apache.kafka.streams.KafkaStreams - stream-client [test-app-dcea4eb1-a58f-4a30-905f-46dad446b31e] All stream threads have died. The instance will be in error state and should be closed.
reduce hit
正如您所见,
.mapValues
在第二次运行时不会被调用,即使它在第一次运行时出错,导致streams应用程序再次重新处理同一事件


是否有可能让streams应用程序以一种简化的步骤重新处理事件,即以前所未有的方式处理事件还是有更好的方法来实现这一点?

我缺少streams应用程序的属性设置

props["processing.guarantee"]= "exactly_once"
通过设置此选项,它将确保在引发异常和streams应用程序崩溃时,从拾取事件的点创建的任何状态都将回滚

问题是streams应用程序将再次拾取事件以重新处理,但reducer步骤的状态已持续。通过启用一次
精确\u设置,可确保减速器状态也会回滚


它现在成功地重新处理了事件,就好像它以前从未见过它一样

不,不,你感到困惑。您不需要重新处理事件。不管怎样,忘掉一切。你能给我解释一句话吗,你的生意有什么问题?您的键值输入主题是什么样的?您期望POJO的结果是什么?“您不需要重新处理事件”-如果事件处理引发异常,Kafka streams将重新处理它,否则您将丢失数据。不管怎么说,答案都是准确的。