Java Spring boot Kafka流侦听器消息在重新启动之间丢失

Java Spring boot Kafka流侦听器消息在重新启动之间丢失,java,spring-boot,apache-kafka,kafka-consumer-api,spring-kafka,Java,Spring Boot,Apache Kafka,Kafka Consumer Api,Spring Kafka,我们使用的是Spring boot kafka listener。问题是,每当pod停止或重新启动时,它会释放偏移量,然后停止处理它留下的消息,这会发生在单个pod(如果它由于某种原因而停止)以及重新启动时的所有pod上。 我们为消费者使用的配置为: consumerProperties: max.poll.records: 300 auto.offset.reset: earliest session.timeout.ms: 300000

我们使用的是Spring boot kafka listener。问题是,每当pod停止或重新启动时,它会释放偏移量,然后停止处理它留下的消息,这会发生在单个pod(如果它由于某种原因而停止)以及重新启动时的所有pod上。 我们为消费者使用的配置为:

consumerProperties:
        max.poll.records: 300
        auto.offset.reset: earliest
        session.timeout.ms: 300000
        request.timeout.ms: 400000
        allow.auto.create.topics: false
        heartbeat.interval.ms: 80000



bindings:
    input:
      destination: some-input
      group: somegroup
      consumer:
        maxAttempts: 2
        autoCommitOffset: false
我们正在使用标头手动确认。自动提交设置为false 当POD重新启动时,我们在grafana上看到一个尖峰,但它不处理第一次运行的任何挂起消息,但是当我推送开始处理的新消息时,这意味着重新启动之间的偏移量丢失,是否缺少属性。 欢迎任何帮助或建议

编辑:消费者中似乎没有收到确认标头。。不知道为什么


-瓦伊巴夫首先,有几件事需要注意:

自动提交设置:false


autocommitofset:false
禁用容器偏移量提交-这意味着您必须使用标头提交偏移量。此属性的名称很不幸,因为它类似于卡夫卡属性。有一个问题。将其设置为true,以便容器进行提交。(根据Gary的评论更新(谢谢Gary))

autocommitofset
设置为
true
,意味着您让侦听器容器为您管理提交,这是推荐的做法。参见和相关的

auto.offset.reset:最早

只有当消费者群体在卡夫卡中没有任何有效的补偿时,此属性才会生效。只要提交了偏移量,就会忽略
auto.offset.reset

现在,正如@Chris所提到的,有两种类型的偏移量,一种是由卡夫卡在内存中保存和管理的,用于确定在下一次轮询()中检索哪些消息,另一种是由您在手动
确认时提交的。您可能已经猜到,当停止/重新启动时,内存中的偏移量将消失。因此,关键是要知道重启后提交的偏移量指向哪里

你正在使用的答案可能就是你所经历的。另外,在pod重新启动之前和之后,您是否可以查询组,查看您的
主题
上是否显示任何
延迟
?在Windows中,该命令类似于:

kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group your_group_name

首先,有几件事需要注意:

自动提交设置:false


autocommitofset:false
禁用容器偏移量提交-这意味着您必须使用标头提交偏移量。此属性的名称很不幸,因为它类似于卡夫卡属性。有一个问题。将其设置为true,以便容器进行提交。(根据Gary的评论更新(谢谢Gary))

autocommitofset
设置为
true
,意味着您让侦听器容器为您管理提交,这是推荐的做法。参见和相关的

auto.offset.reset:最早

只有当消费者群体在卡夫卡中没有任何有效的补偿时,此属性才会生效。只要提交了偏移量,就会忽略
auto.offset.reset

现在,正如@Chris所提到的,有两种类型的偏移量,一种是由卡夫卡在内存中保存和管理的,用于确定在下一次轮询()中检索哪些消息,另一种是由您在手动
确认时提交的。您可能已经猜到,当停止/重新启动时,内存中的偏移量将消失。因此,关键是要知道重启后提交的偏移量指向哪里

你正在使用的答案可能就是你所经历的。另外,在pod重新启动之前和之后,您是否可以查询组,查看您的
主题
上是否显示任何
延迟
?在Windows中,该命令类似于:

kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group your_group_name

预期的配置是spring.cloud.stream.kafka.default尽管如此,我们还是spring.cloud.stream.default,这是因为yaml中嵌套的属性太多:(这起作用了

预期的配置是spring.cloud.stream.kafka.default尽管如此,我们还是spring.cloud.stream.default,这归咎于yaml中嵌套属性太多:(这起作用了

嘿,你应该使用tolatest而不是earliest作为偏移量设置。earliest从第一条未使用的消息开始,所以我认为这不应该是一个问题。no,earliest从主题的开头开始。但是,auto.offset.reset配置仅在使用者开始时使用,并且其设置没有提交的偏移量该分区的组。需要明确的是,当使用者处于活动状态时,它会使用内存中的偏移量。重新平衡后,使用者会从上次提交的偏移量(如果有)开始,否则,最后的方法是参考auto.offset.reset configuration,这意味着在任何一种情况下,重启后的挂起消息都应该被删除考虑到,我正在使用spring cloud config store,pod重新启动后,是否会出现组分配给消费者的问题?假设新pod旋转时,旧pod有时需要一段时间才能被杀死。嘿,你应该使用tolatest而不是earliest作为偏移设置。earliest从第一条未使用的消息开始因此,我认为这不应该是一个问题。不,最早的配置从主题的开始就开始了。但是,auto.offset.reset配置仅在使用者启动时使用,并且该分区的组没有提交的偏移量。需要明确的是,当使用者还活着时,它是u