繁体   English   中英

Spring 引导 Kafka Stream 侦听器消息偏移量在重新启动之间丢失

[英]Spring boot Kafka Stream Listener message offset lost between restarts

我们正在使用 Spring 启动 kafka 侦听器,问题是每当 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

我们使用 header 手动确认。 自动提交设置为 false 重新启动 pod 时,我们看到 grafana 出现峰值,但它不处理第一次运行的任何待处理消息,但是当我推送新消息时,这些消息开始被处理,这意味着偏移量是在重新启动之间丢失,是否缺少属性。 非常欢迎任何帮助或建议。

编辑:似乎消费者没有收到确认 header .. 不知道为什么

-毗婆婆

首先,有几点需要注意:

自动提交偏移:假

autoCommitOffset: false禁用容器偏移提交 - 这意味着您必须使用 header 来提交偏移。 这个属性的名字是不幸的,因为它类似于kafka属性。 有一个未解决的问题来重命名它 将其设置为 true 以便容器进行提交。(根据 Gary 的评论更新(感谢 Gary))

autoCommitOffset设置为true意味着您让侦听器容器为您管理提交,这是推荐的做法。 请参阅autoCommitOffset和相关的提交偏移量

auto.offset.reset:最早

只有当消费者组没有在 Kafka 中提交任何有效的偏移量时,此属性才会生效。 每当提交偏移量时,都会忽略auto.offset.reset

现在,正如@Chris 所提到的,有 2 种类型的offsets ,一种由 Kafka在内存中保存和管理,它决定了在下一次 poll() 中检索哪些消息,另一种是commit ,在您的案例,由您,当您手动acknowledge时。 正如您可能已经猜到的那样,当停止/重新启动时,内存中的偏移量就消失了。 所以,关键是要知道重启后提交的偏移量指向哪里。

您正在使用的AckMode可能包含您所遇到的问题的答案。 另外,在 pod 重启之前和之后,你可以查询组,看看你的topic是否有任何lags 在 Windows 中,命令类似于:

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

Expected configuration was spring.cloud.stream.kafka.default in spite of this we were spring.cloud.stream.default blame it on having too many nested properties in yaml:( this worked

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM