【问题标题】:Need clarification about Kafka auto commit and auto.commit.interval.ms需要澄清 Kafka 自动提交和 auto.commit.interval.ms
【发布时间】:2016-11-08 21:50:04
【问题描述】:

文档https://www.safaribooksonline.com/library/view/kafka-the-definitive/9781491936153/ch04.html“请注意,启用自动提交后,对轮询的调用将始终提交上一次轮询返回的最后一个偏移量。它不知道实际处理了哪些事件,所以在再次调用 poll 之前(或在调用 close() 之前,它也会自动提交偏移量),始终处理 poll 返回的所有事件是至关重要的"。如果是这种情况,如果 auto.commit.interval.ms 大于处理从以前的poll() 收到的消息所需的时间,它如何工作。

为了更具体,请考虑以下场景:

enable.auto.commit=true

auto.commit.interval.ms=10

然后我循环调用poll()

1) 在第一次调用 poll() 时,我收到 1000 条消息(偏移量 2000-3000),处理所有 1000 条消息需要 1 毫秒

2) 我再次致电poll()。在第二次poll() 调用中,它应该提交从之前的poll() 返回的最新偏移量3000,但由于auto.commit.interval.ms 设置为10 ms,它不会提交偏移量,对吧?

在这种情况下,提交的偏移量会越来越落后于实际处理的最新偏移量?

有人可以澄清/确认吗?

【问题讨论】:

    标签: kafka-consumer-api


    【解决方案1】:

    您正确地描述了该行为。但是,你的结论是不正确的。提交的偏移量不会越来越滞后。自动提交间隔过后,下一次调用 poll 将提交 所有 已处理的消息。

    假设您每 10 毫秒调用一次 poll,并将 commit-interval 设置为 100 毫秒。因此,在每 10 次轮询调用中都会提交(并且此提交涵盖来自最近 10 次轮询调用的所有消息)。

    【讨论】:

    • 你是对的。最终同步了 2 个偏移量(已提交的和最新处理的),但在此之前已提交的偏移量将一直落后。
    • 两次提交之间是的。这是为了减少 Kafka 必须处理的提交数量的行为。回想一下,Kafka 提供了至少一次交付保证。因此,这是在提交次数和发生故障时需要重新处理多少数据之间进行权衡。
    • 如果 poll 调用在 100 毫秒之后并设置 auto-commit-interval 为 10 毫秒会怎样。
    • 在 KafkaStreams 中,消费者 auto.commit 被禁用,并且库进行手动提交。
    • @ManishJaiswal 由于 commit()poll() 后调用,它将在 100 毫秒后触发提交(在您的场景中)。 This 详细说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2012-07-18
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多