[英]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
RecoveringBatchErrorHandler
与BatchListenerFailedException
结合使用,您必须抛出异常以指示批处理中的哪条记录失败。
这样,先前记录的偏移量将被提交,批处理的其余部分将被重放。
任何其他异常都将导致整个批次无限期地重新传送,因为它委托给一个没有恢复机制的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.