【问题标题】:Kafka - Offset Commit & Seek卡夫卡 - 偏移提交和寻求
【发布时间】:2020-03-13 06:22:19
【问题描述】:

我目前正在从具有特定偏移量的主题中获取消息。我正在使用 seek() 来实现它。但是当我将 enable.auto.commit 设置为 true 或使用手动同步 (commitSync()/commitAsync()),Seek() 不起作用,因为它没有从特定偏移量轮询消息,而是从最后提交的偏移量中选择。

那么当使用 Seek() 时,是否必须将偏移量存储在外部数据库中而不是提交给 Kafka ? Seek 和 Commit 不会并行工作?

客户端版本 - kafka-clients - 2.4.0

谢谢!!

【问题讨论】:

  • 你能分享你的代码和消费者配置吗?
  • Q1:没有。 Q2:他们一起工作。请分享您所做的(代码和配置),以便我们更好地帮助您
  • @H.Ç.T & @Ashish Bhosle,抱歉。我写的代码有错误。当我使用自动/手动提交时,Seek() 正在工作。

标签: java apache-kafka kafka-consumer-api


【解决方案1】:

当您提交时(无论是自动还是手动几乎没有区别),您将在代理端存储消费者已到达分区多远的记录。这个提交的偏移量只在重新平衡的情况下使用,因此当消费者被分配到该分区时,他们可以从已知所有先前消息都已处理的点处获取。这保证了只要消费者被正确编码,在消息被顺序处理时,在组成员发生变化的情况下,消息在消费时不会丢失。

当组成员稳定时,提交的偏移量什么也不做。每个消费者都有自己的内存偏移量,它维护并在每次从代理获取一批记录时使用。默认情况下,此偏移量按顺序增加。 seek 方法仅更改此内存中的偏移量,以便下一次轮询将从您指定的任意偏移量中获取,除非它不存在,在这种情况下将引发异常。

如果您在外部存储提交偏移量,则可以在重新平衡后使用 seek 来检索外部存储的偏移量并从那里获取,但在这种情况下,您必须在 RebalanceListener 中调用 seek - 如果您在 poll 之前调用 seek 它会没有效果,因为消费者只在 poll 方法期间发现重新平衡和新分区分配,因此在 poll 期间不干预它将从最后提交的偏移量开始消费。

当你暂停消费者时,也会出现这种稍微不直观的情况,我在https://chrisg23.blogspot.com/2020/02/why-is-pausing-kafka-consumer-so.html?m=1 写过一些内容

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 2019-12-15
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多