Spring boot 我应该使用带有API restTemplate重试机制的SeektocurInterrorHandler吗?

Spring boot 我应该使用带有API restTemplate重试机制的SeektocurInterrorHandler吗?,spring-boot,spring-kafka,Spring Boot,Spring Kafka,我试图在SpringKafka中编写一个kafka消费者应用程序。作为消费者,我必须确保我没有丢失任何记录,所有记录都应该得到处理 我的应用程序设计如下: Topics --> Read records from topic --> dump it into a table A in oracle database --> pick records from a table A --> call rest api to update records in system t

我试图在SpringKafka中编写一个kafka消费者应用程序。作为消费者,我必须确保我没有丢失任何记录,所有记录都应该得到处理

我的应用程序设计如下:

Topics --> Read records from topic --> dump it into a table A in oracle database --> pick records from a table A --> call rest api to update records in system table B --> update response of API in table a --> commit records 
API级别的重试机制:

现在,如果任何记录失败,则表示响应代码不符合要求(400500等)。我们将重试这些记录2次

主题级重试机制:

但是,如果我在提交偏移量时出错怎么办?也就是说,我需要在主题级别上有某种重试机制。我查看了文档,发现了一个选项:
SeekToCurrentErrorHandler

@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory();
    factory.setConsumerFactory(consumerFactory());
    factory.getContainerProperties().setAckOnError(false);
    factory.getContainerProperties().setAckMode(AckMode.RECORD);
    factory.setErrorHandler(new SeekToCurrentErrorHandler(new FixedBackOff(1000L, 2L)));
    return factory;
}
@Bean
公共ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(){
ConcurrentKafkListenerContainerFactory=新ConcurrentKafkListenerContainerFactory();
setConsumerFactory(consumerFactory());
factory.getContainerProperties().setAckoneError(false);
factory.getContainerProperties().setAckMode(AckMode.RECORD);
factory.setErrorHandler(新的SeektocurInterrorHandler(新的FixedBackOff(1000L,2L));
返回工厂;
}
现在,据我所知,假设我不能提交任何偏移量,那么在添加上述代码之后,这将重试一次传递,最多重试2次(3次传递尝试),并后退1秒。那么,这是否意味着我的整个流程将被重放两次?如果这是真的,那么我是否需要在API级别单独添加重试机制


我只是想了解,如何使我的消费者应用程序更具弹性,这样我就不会在处理过程中丢失任何记录,并且应该有错误机制来处理任何错误/丢失的记录。请建议。

最好避免无法提交偏移量的情况(确保
max.poll.interval.ms
足够)

但是,是的,如果提交偏移失败(并且
commitSync
为true),则记录将重新交付给应用程序。如果commitSync为
false
,则故障将被简单地记录(或发送到侦听器),并且该分区的“下一个”偏移量将在稍后提交(可能)

在应用程序级别添加重试(例如,通过容器工厂在侦听器适配器中使用
RetryTemplate
)仍会遇到相同的问题;如果重试时间过长,也可能导致重新平衡

如果您确实希望避免在这种情况下重新处理,则需要使侦听器代码幂等,例如,将主题/分区/偏移量存储在某个位置,以表明您已经处理了该记录