我正在使用Spring Kafka 1.2.2.RELEASE。我有一个Kafka Listener作为消费者,它可以监听主题并以弹性方式索引文档。 我的自动提交偏移属性设置为true //默认。
我的印象是,如果侦听器中存在异常(弹性已关闭),则不应提交偏移量,并且应为下次轮询处理相同的消息
然而,这并没有发生,并且消费者在下一次轮询中提交了偏移量。在阅读帖子和文档之后,我了解到这种情况是自动提交设置为true,下次轮询将提交所有偏移
我怀疑为什么消费者调用下一个轮询以及如何防止任何偏移从提交自动提交为true或者我是否需要将此属性设置为false并手动提交。
答案 0 :(得分:2)
我更喜欢将其设置为false;容器为您管理抵消更为可靠。
将容器的AckMode
设置为RECORD
(默认为BATCH
),容器将在侦听器返回后为您提交偏移量。
同时考虑升级至至少1.3.3(当前版本为2.1.4);由于KIP-62
,1.3.x引入了一个更简单的线程模型修改强>
使用自动提交时,无论成功/失败,都将提交偏移量。容器在失败后不会提交,除非ackOnError
为真(不使用自动提交的另一个原因)。
然而,由于经纪人不会再次发送相同记录,因此仍然无法提供帮助。您必须在Consumer
上执行搜索操作。
在2.0.1(当前版本为2.1.4)中,我们添加了SeekToCurrentErrorHandler
,这将导致在下次轮询时重新发送失败和未处理的记录。 See the reference manual
您也可以使用ConsumerAwareListener
自行执行搜索(也在2.0中添加)。
对于旧版本(> = 1.1),您必须使用ConsumerSeekAware
的{{1}}监听器。
另一种方法是添加is quite a bit more complicated,以便根据重试设置重新尝试投放。
答案 1 :(得分:1)
显然,Spring Kafka< = 1.3.3 @KafkaListener会丢失消息,即使你使用ackOnError = false如果我们希望Spring Kafka能够自动(至少是文档)通过重试和#34来处理这个问题;根本不再做民意调查"? :)。并且,默认行为是仅记录。
我们能够在使用spring-kafka 1.3.3.RELEASE(没有maven源)和单个分区主题,并发(1),AckOnError(false),BatchListener(true)时重现消费者的消息丢失/跳过)对于任何运行时异常,使用AckMode(BATCH)。我们最终在模板中重试或探索ConsumerSeekAware。
@GaryRussell,关于"经纪人不会再次发送同样的记录"或者继续返回下一批没有提交的消息?这是因为,消费者民意调查是基于它寻求获得下一批记录的当前偏移量而不是完全针对最后提交的偏移量?基本上,消费者根本不需要承诺在每次处理时假设一些运行时异常并且继续在主题上消费整个消息。只有重新启动才会从上次提交的偏移量(重复)开始。
升级到2.0+以使用ConsumerAwareListenerErrorHandler似乎需要升级到至少Spring 5.x,这是一次重大升级。