当 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 条记录被写入分区。
- myConsumer 第一次轮询,returns 前 10 条记录说 0 - 9 条记录。
- 成功处理所有记录。
- 它向 Kafka 调用了 commitAsync() 以提交最后一个偏移量。
- 提交响应正在处理中。可以是成功也可以是失败。
- 但是,由于它是异步模式,它会继续轮询下一批。
- 现在,Kafka 或 consumer poll 如何知道它必须从第 10 个位置开始读取?因为 commitAsync 请求尚未完成。
请帮助我理解这个概念。
Commit Offset 告诉broker消费者已经成功处理了相应的消息。消费者本身会知道它的进度(除了消费者的开始,它从代理那里获得最后提交的偏移量)。
在您描述的第 5 步,提交偏移量正在进行中。所以:
- 经纪人不知道已经处理了 0-9 条记录
- 消费者本身已经阅读了消息,因此它知道自己已经阅读了 0-9 条消息。所以它会知道接下来要读第 10 个。
可能的场景
- 假设 (0-9) 的提交失败。您的下一批,比如 (10-15) 已成功处理和提交,那么就不会造成任何伤害。由于我们向经纪人标记到 15 的处理已完成。
- 假设 (0-9) 的提交失败。您的下一批 (10-15) 已处理,在提交之前,消费者会关闭。当您的消费者重新启动时,它会从经纪人那里获取其状态(这对任何一个批次都没有提交)。所以它将从第 0 条消息开始读取。
您还可以想出其他几种方案。我想底线是,当您的消费者出于任何原因重新启动并且它已从 kafka 代理获得最后处理的偏移量时,提交的重要性就会显现出来。
我有一个关于 Kafka 消费者消费记录的用例。 例如, 我有 1 个主题,其中有 1 个分区。目前,它有 10 条记录,在使用前 10 条记录时,另外 10 条记录被写入分区。
- myConsumer 第一次轮询,returns 前 10 条记录说 0 - 9 条记录。
- 成功处理所有记录。
- 它向 Kafka 调用了 commitAsync() 以提交最后一个偏移量。
- 提交响应正在处理中。可以是成功也可以是失败。
- 但是,由于它是异步模式,它会继续轮询下一批。
- 现在,Kafka 或 consumer poll 如何知道它必须从第 10 个位置开始读取?因为 commitAsync 请求尚未完成。
请帮助我理解这个概念。
Commit Offset 告诉broker消费者已经成功处理了相应的消息。消费者本身会知道它的进度(除了消费者的开始,它从代理那里获得最后提交的偏移量)。
在您描述的第 5 步,提交偏移量正在进行中。所以:
- 经纪人不知道已经处理了 0-9 条记录
- 消费者本身已经阅读了消息,因此它知道自己已经阅读了 0-9 条消息。所以它会知道接下来要读第 10 个。
可能的场景
- 假设 (0-9) 的提交失败。您的下一批,比如 (10-15) 已成功处理和提交,那么就不会造成任何伤害。由于我们向经纪人标记到 15 的处理已完成。
- 假设 (0-9) 的提交失败。您的下一批 (10-15) 已处理,在提交之前,消费者会关闭。当您的消费者重新启动时,它会从经纪人那里获取其状态(这对任何一个批次都没有提交)。所以它将从第 0 条消息开始读取。
您还可以想出其他几种方案。我想底线是,当您的消费者出于任何原因重新启动并且它已从 kafka 代理获得最后处理的偏移量时,提交的重要性就会显现出来。