Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Kafka在发生故障时自动提交偏移量_Spring_Apache Kafka_Spring Kafka - Fatal编程技术网

Spring Kafka在发生故障时自动提交偏移量

Spring Kafka在发生故障时自动提交偏移量,spring,apache-kafka,spring-kafka,Spring,Apache Kafka,Spring Kafka,我使用的是Spring Kafka 1.2.2.RELEASE。我有一个Kafka侦听器作为消费者,它侦听一个主题,并用elastic为文档编制索引。 我的自动提交偏移量属性设置为true//default 我的印象是,如果侦听器中出现异常(elastic已关闭),则不应提交偏移量,并且应为下一次轮询处理相同的消息 但是,这并没有发生,消费者在下一次轮询时提交了偏移量。在阅读文章和文档后,我了解到,如果将“自动提交”设置为“真”,则“下一次轮询”将提交所有偏移量 我的疑问是,消费者为什么要调用下

我使用的是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自动提交。