首页 > 解决方案 > 当commitAsync提交偏移失败时,Kafka如何提供下一批记录进行轮询

问题描述

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

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

请帮助我理解这个概念。

标签: apache-kafkakafka-consumer-api

解决方案


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

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

  • Broker 不知道0-9 条记录已被处理
  • 消费者本身已读取消息,因此它知道已读取 0-9 条消息。所以它会知道接下来从第 10 个开始阅读。

可能的情况

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

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


推荐阅读