【问题标题】:How does the enable.auto.commit and auto.commit.interval.ms affects offset commit in a consumerenable.auto.commit 和 auto.commit.interval.ms 如何影响消费者的偏移提交
【发布时间】:2020-02-27 23:10:35
【问题描述】:

这是我的消费者设置。

enable.auto.commit  - true (default value)
auto.commit.interval.ms - 5000 ms (default value)
max.poll.interval.ms - 5 mins (default value)
max.poll.records - 500 (default value)

使用这些设置,假设我在轮询时获得 500 条记录,如果消费者在这 5000 毫秒内只能处理 100 条记录,我的问题是

  1. 是否只提交 100 条记录?
  2. 如果上述问题的答案是“是”,那么其他记录会怎样?
  3. 如果第一个问题的答案为否,则应提交所有 500 条记录的偏移量。那么“max.poll.interval.ms”什么时候出现?这对偏移提交有何影响?

【问题讨论】:

  • 1) 请将帖子限制为单个问题。 2) 为什么要启用自动提交?你能解释一下你的用例吗
  • 默认值为true,所以,我想了解,当我离开默认设置时会发生什么。
  • 好吧,你失去了传递和弹性的数据保证。
  • 我想偏移提交和轮询是不同的线程。如果消费者重新平衡,我不确定提交是否继续。欢迎您设置自己的监控并尝试一下
  • 感谢您提供详细信息。我试试看

标签: apache-kafka


【解决方案1】:

我假设你问的是〜现代的 Java 消费者。

它会只提交 100 条记录吗?

如果您使用消费者组管理(subscribe() 函数),除了向代理发送心跳之外,消费者上的一切都发生在调用者线程(您的线程)上,作为调用的一部分poll()。这包括提交补偿。这意味着在您调用 poll() 之前不会发送任何偏移量,因此在您的情况下答案是否定的 - 只有在您完成这 500 条记录后才会提交偏移量。

如果上述问题的答案是“是”,那么其他记录会怎样?

答案是否定的,但在一些较旧的客户端中,后台线程负责自动偏移提交,更糟糕的情况是,如果您的应用程序崩溃,它将恢复到第 500 条记录的位置(所以您会跳过超过您尚未处理的 400 条记录)。但同样,现代消费者并非如此

如果第一个问题的答案是否定的,它应该提交所有 500 条记录的偏移量。那么“max.poll.interval.ms”什么时候出现,这对偏移提交有何影响?

仅当您使用消费者组管理(subscibe(),而不是assign())时,偏移提交和“活跃度”才相关。假设您使用 CGM,kafka 集群需要确定消费者是否“活着”,如果他们认为消费者已经死亡,它的工作(分区)将重新分配给另一个活着的消费者。现代 kafka 将“活力”定义为“取得进步”,取得进步意味着您“经常”调用民意调查。 “经常足够”由max.poll.interval 定义 - 因此,即使有一个心跳线程以更短的时间间隔向 kafka 发送心跳(我认为默认值是 ~3 秒),如果您停止调用 poll 5 分钟,心跳线程也会停止。更准确地说 - 心跳线程将向 kafka 发送离开组请求,然后停止。如果您处于这种情况(由于缺乏进展而被踢出组),您的消费者提交抵消的任何尝试都将失败 - 如果使用 CGM,kafka 仅接受来自实时成员的抵消提交。

这意味着 max.poll.intervalmax.poll.records 之间存在固有的权衡 - 您从消费者中 poll() 的工作量越大,完成它们并致电 poll() 所需的时间就越长同样,您被踢出小组的风险就越高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2020-03-05
    • 2017-08-22
    • 2022-11-13
    • 1970-01-01
    • 2021-11-10
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多