当 commitAsync 提交偏移量失败时,Kafka 如何提供下一批记录进行轮询

How does Kafka provides next batch of records to poll when commitAsync gets failed in committing offset

我有一个关于 Kafka 消费者消费记录的用例。 例如, 我有 1 个主题,其中有 1 个分区。目前,它有 10 条记录,在使用前 10 条记录时,另外 10 条记录被写入分区。

  1. myConsumer 第一次轮询,returns 前 10 条记录说 0 - 9 条记录。
  2. 成功处理所有记录。
  3. 它向 Kafka 调用了 commitAsync() 以提交最后一个偏移量。
  4. 提交响应正在处理中。可以是成功也可以是失败。
  5. 但是,由于它是异步模式,它会继续轮询下一批。
  6. 现在,Kafka 或 consumer poll 如何知道它必须从第 10 个位置开始读取?因为 commitAsync 请求尚未完成。

请帮助我理解这个概念。

Commit Offset 告诉broker消费者已经成功处理了相应的消息。消费者本身会知道它的进度(除了消费者的开始,它从代理那里获得最后提交的偏移量)。

在您描述的第 5 步,提交偏移量正在进行中。所以:

  • 经纪人不知道已经处理了 0-9 条记录
  • 消费者本身已经阅读了消息,因此它知道自己已经阅读了 0-9 条消息。所以它会知道接下来要读第 10 个。

可能的场景

  1. 假设 (0-9) 的提交失败。您的下一批,比如 (10-15) 已成功处理和提交,那么就不会造成任何伤害。由于我们向经纪人标记到 15 的处理已完成。
  2. 假设 (0-9) 的提交失败。您的下一批 (10-15) 已处理,在提交之前,消费者会关闭。当您的消费者重新启动时,它会从经纪人那里获取其状态(这对任何一个批次都没有提交)。所以它将从第 0 条消息开始读取。

您还可以想出其他几种方案。我想底线是,当您的消费者出于任何原因重新启动并且它已从 kafka 代理获得最后处理的偏移量时,提交的重要性就会显现出来。