Spring Cloud Stream Kafka Binder autoCommitOnError = false获得意外行为

时间:2019-03-18 05:47:36

标签: apache-kafka stream spring-cloud-stream

我正在使用Spring Boot 2.1.1.RELEASE和Spring Cloud Greenwich.RC2,spring-cloud-stream-binder-kafka的托管版本是2.1.0RC4。 Kafka版本是1.1.0。我设置了以下属性,因为如果出现错误,则不应使用消息。

spring.cloud.stream.bindings.input.group=consumer-gp-1
...
spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOnError=false
spring.cloud.stream.kafka.bindings.input.consumer.enableDlq=false
spring.cloud.stream.bindings.input.consumer.max-attempts=3
spring.cloud.stream.bindings.input.consumer.back-off-initial-interval=1000  
spring.cloud.stream.bindings.input.consumer.back-off-max-interval=3000 
spring.cloud.stream.bindings.input.consumer.back-off-multiplier=2.0  
.... 

Kafka主题中有20个分区,并且Kerberos用于身份验证(不确定是否相关)。

Kafka使用者正在为其处理的每条消息调用一个Web服务,如果该Web服务不可用,那么我希望该使用者随后将尝试处理该消息3次,然后再继续处理下一条消息。因此,对于我的测试,我禁用了Web服务,因此无法正确处理任何消息。从日志中,我可以看到这正在发生。

一段时间后,我停止然后重新启动了Kafka使用者(仍然禁用了Web服务)。我期望在重启Kafka使用者之后,它将尝试处理第一次未成功处理的消息。重新启动Kafka Consumer之后,从日志(我打印出每条消息及其字段)中,我看不到这种情况。我以为分区可能会有所影响,但是我检查了日志,所有20个分区都分配给了该单个使用者。

有没有我想念的财产?我认为当我第二次重新启动使用者时,预期的行为是Kafka经纪人会将未成功处理的记录再次传递给使用者。

谢谢

1 个答案:

答案 0 :(得分:0)

参数按预期工作。查看评论。