繁体   English   中英

无法在 Spring Kafka 中找到处理批量消息恢复的正确方法

[英]Unable to find the proper way to handle recovery in Spring Kafka with a batch of messages

我正在开发一个非常简单的 Spring Boot 应用程序,它将处理来自单个主题的消息,然后将这批消息保存到 Cassandra 数据库中。 我尝试将 Spring Kafka 与一批消息一起使用,每次当我的 onMessage() 方法抛出 MyKafkaRetryException 时,就会开始无休止的重新处理循环,但我希望在重试完成后,将这批消息移至 DLT。 (如果我抛出任何其他异常,则会立即将一条消息移至 DLT。)我刚刚配置了一个具有我自己的异常分类的 RecoveringBatchErrorHandler。 所以我不知道这里出了什么问题。

    @Bean
    public RecoveringBatchErrorHandler recoveringBatchErrorHandler(
        RetryProperties retryProperties,
        ConsumerRecordRecoverer consumerRecordRecoverer)
    {
        ExponentialBackOff backOff = new ExponentialBackOff(retryProperties.getInitialInterval().toMillis(), retryProperties.getMultiplier());
        backOff.setMaxInterval(retryProperties.getMaxInterval().toMillis());
        backOff.setMaxElapsedTime(retryProperties.calculateMaxElapsedTime().toMillis());
        
        RecoveringBatchErrorHandler errorHandler = new RecoveringBatchErrorHandler(consumerRecordRecoverer, backOff);
        errorHandler.setClassifications(
            ImmutableMap.of(
                MyKafkaRetryException.class, true), 
            false);

        return errorHandler;
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<?, ?> batchKafkaListenerContainerFactory(
            ConsumerFactory<Object, Object> kafkaConsumerFactory,
            RecoveringBatchErrorHandler recoveringBatchErrorHandler)
    {
        ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(kafkaConsumerFactory);
        factory.setBatchListener(true);
        factory.setBatchErrorHandler(recoveringBatchErrorHandler);
        return factory;
    }

我在 OSX 上使用 Spring Kafka 2.6.9 和 JDK 1.8_261

RecoveringBatchErrorHandlerBatchListenerFailedException结合使用,您必须抛出异常以指示批处理中的哪条记录失败。

这样,先前记录的偏移量将被提交,批处理的其余部分将被重放。

任何其他异常都将导致整个批次无限期地重新传送,因为它委托给一个没有恢复机制的SeekToCurrentBatchErrorHandler ,因为我们不知道哪个记录失败了。 在使用提供的BackOff时,当它耗尽时,间隔的最后一个后退用于额外的重试。

https://docs.spring.io/spring-kafka/docs/current/reference/html/#recovering-batch-eh

或者,您可以使用RetryingBatchErrorHandler ,它会在重试次数耗尽时将整个批次发送到 DLT。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM