Spring Kafka在发生故障时自动提交偏移量
我使用的是Spring Kafka 1.2.2.RELEASE。我有一个Kafka侦听器作为消费者,它侦听一个主题,并用elastic为文档编制索引。 我的自动提交偏移量属性设置为true//default 我的印象是,如果侦听器中出现异常(elastic已关闭),则不应提交偏移量,并且应为下一次轮询处理相同的消息 但是,这并没有发生,消费者在下一次轮询时提交了偏移量。在阅读文章和文档后,我了解到,如果将“自动提交”设置为“真”,则“下一次轮询”将提交所有偏移量Spring Kafka在发生故障时自动提交偏移量,spring,apache-kafka,spring-kafka,Spring,Apache Kafka,Spring Kafka,我使用的是Spring Kafka 1.2.2.RELEASE。我有一个Kafka侦听器作为消费者,它侦听一个主题,并用elastic为文档编制索引。 我的自动提交偏移量属性设置为true//default 我的印象是,如果侦听器中出现异常(elastic已关闭),则不应提交偏移量,并且应为下一次轮询处理相同的消息 但是,这并没有发生,消费者在下一次轮询时提交了偏移量。在阅读文章和文档后,我了解到,如果将“自动提交”设置为“真”,则“下一次轮询”将提交所有偏移量 我的疑问是,消费者为什么要调用下
我的疑问是,消费者为什么要调用下一次轮询,以及我如何防止使用“自动提交”提交任何偏移量为true,或者我是否需要将此属性设置为false并手动提交。我更喜欢将其设置为false;容器为您管理偏移更可靠 将容器的
AckMode
设置为RECORD
(默认为BATCH
),容器将在侦听器返回后为您提交偏移量
也考虑升级到至少1.3.3(当前版本为2.1.4);1.3.x引入了更简单的线程模型,这要归功于
编辑 使用自动提交,无论成功/失败,都将提交偏移量。容器在失败后不会提交,除非ackOnError
为true(不使用自动提交的另一个原因)
但是,这仍然没有帮助,因为代理不会再次发送相同的记录。为此,您必须在耗电元件上执行寻道操作
在2.0.1(当前版本为2.1.4)中,我们添加了SeekToCurrentErrorHandler
,这将导致在下次轮询时重新发送失败和未处理的记录
您还可以使用ConsumerRawareListener
执行seek yourself(也在2.0中添加)
对于较旧的版本(>=1.1),您必须使用一个ConsumerSekAware
监听器
另一种选择是添加,以便根据重试设置重新尝试传递。显然,Spring Kafka会丢失消息。但是,根据我的理解,这是预期的行为吗?记录不应提交,即使自动提交为真,也会重放;提交是无关紧要的。关于Spring卡夫卡的升级——我们正在使用卡夫卡客户端0.102,并且支持卡夫卡客户端0.102的最新的Spring卡夫卡版本是1.2.Xi AM正在进行手动提交。但是,即使AccOnError作为false,代理也不会再次发送相同的记录,那么,将ackOnError设置为false有什么意义呢?我是否缺少ackOnError将派上用场的特定用户案例。ackOnError=false
通常在容器发生故障后停止时使用。这样,当容器重新启动时,失败的消息将被重新传递。我相信从0.10.2.0开始,只要你不尝试使用新功能,新客户就可以与老经纪人交谈。我们现在有了SeekToCurrentErrorHandler
,它避免了停止容器。不过,我建议升级您的经纪人。我们无法升级Spring kafka(1.2.2),因为它还要求kafka客户端升级(目前为0.10.2)至最低0.11,是的,我同样怀疑,如果消费者要投票,而不管之前的记录是否已成功处理,那么提交是否仅在重新启动的情况下相关?Spring kafka 1.3.3与0.10兼容。较新的Spring Kafka版本允许客户机完全访问消费者以更新偏移量等,但一般来说,如果客户机代码可能再次抛出运行时异常,Spring库继续重试运行时异常是没有意义的。我们添加了一些重试,比如DB/IO异常,rest只是使用错误处理程序记录到文件/DB流中,以继续处理rest。是的,然后可以使用此方法在try/finally中使用Ack来控制提交。或者对批处理/记录使用自动提交方法,让spring自动提交。