Kotlin Kafka streams:groupByKey和reduce在流中发生错误时不触发操作一次
我有一个简单的Kafka streams场景,其中我在做一个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
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将重新处理它,否则您将丢失数据。不管怎么说,答案都是准确的。