在Kafka Stream中处理消息时发生错误时重新处理消息

时间:2019-05-28 12:15:49

标签: java apache-kafka apache-kafka-streams spring-kafka

我有一个简单的基于Kafka Streams的Spring应用程序,该应用程序使用来自传入主题的消息,进行map转换并打印此消息。 KStream像这样配置

@Bean
public KStream<?, ?> processingPipeline(StreamsBuilder builder, MyTransformer myTransformer,
         PrintAction printAction, String topicName) {
    KStream<String, JsonNode> source = builder.stream(topicName,
                Consumed.with(Serdes.String(), new JsonSerde<>(JsonNode.class)));
    // @formatter:off
    source
        .map(myTransformer)
        .foreach(printAction);
    // @formatter:on
    return source;
}

MyTransformer内部,我正在调用外部微服务,该服务此时可能已关闭。如果通话失败(通常会抛出RuntimeException),我将无法进行转换。

这里的问题是,如果在先前的处理过程中发生任何错误,是否可以在Streams应用程序中再次重新处理消息?

根据我目前的研究,这里是没有办法的,我唯一的可能是将消息放入无聊的主题,并在以后再次失败时尝试对其进行处理,我再次将其放入DLT中并执行重试这种方式。

1 个答案:

答案 0 :(得分:1)

如果在Kafka Streams处理期间发生任何未捕获的异常,则您的流将状态更改为ERROR,并停止使用进入的消息作为发生错误的分区的信息。 您需要自己捕获异常。可以执行以下重试操作:1)使用Spring RetryTemplate调用外部微服务(但请记住,使用特定分区的消息会有延迟),或2)将失败的消息推送到另一个主题中以供以后重新处理(按照您的建议)