Java 尝试处理卡夫卡消息是否会永远导致消费者重新平衡

Java 尝试处理卡夫卡消息是否会永远导致消费者重新平衡,java,spring-boot,apache-kafka,spring-kafka,spring-retry,Java,Spring Boot,Apache Kafka,Spring Kafka,Spring Retry,我有一个卡夫卡消费者方法,注释为@kafkalistener。我已经在容器上设置了重试模板,并且重试配置是这样的:如果在处理消息时发生了一些异常,它总是会重试。我已将最大投票记录设置为1。如果这种情况实时发生,并且消费者一直在重试味精,那么经纪人会认为该消费者已经死亡并触发重新平衡吗?或者,在重试时,消费者是否对未能处理的相同消息进行轮询?如果这是真的,因为民意调查正在进行,我的假设是不会有任何再平衡。此外,我正在手动提交偏移量,因此我的enable.auto.commit属性设置为false,

我有一个卡夫卡消费者方法,注释为@kafkalistener。我已经在容器上设置了重试模板,并且重试配置是这样的:如果在处理消息时发生了一些异常,它总是会重试。我已将最大投票记录设置为1。如果这种情况实时发生,并且消费者一直在重试味精,那么经纪人会认为该消费者已经死亡并触发重新平衡吗?或者,在重试时,消费者是否对未能处理的相同消息进行轮询?如果这是真的,因为民意调查正在进行,我的假设是不会有任何再平衡。此外,我正在手动提交偏移量,因此我的enable.auto.commit属性设置为false,而ack模式为手动。谁能澄清一下吗?提前感谢。

是的,在侦听器适配器级别使用无状态重试(默认)时,如果超过
max.poll.interval.ms
,将导致重新平衡

你应该改用

在这种情况下,异常被抛出到容器中,一个
SeekToCurrentErrorHandler
重新查找未处理的分区(包括失败的记录)。您仍然需要确保最大退避时间小于轮询间隔。无需将
max.poll.records
设置为1,因为搜索是在所有未处理的分区上完成的


从2.3版开始,您可以在侦听器级别消除重试,只需使用
SeekToCurrentErrorHandler

谢谢您的回答。读完这篇文章后,我还有几个问题,我将作为另一个问题提问。但这是我问题的公认答案。再次感谢@加里·拉塞尔