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