apache-kafka - 当commitAsync提交偏移失败时,Kafka如何提供下一批记录进行轮询
问题描述
我有一个关于 Kafka 消费者使用记录的用例。例如,我有 1 个主题有 1 个分区。目前,它有 10 条记录,在消耗前 10 条记录时,另外 10 条记录被写入分区。
- myConsumer 第一次轮询并返回前 10 条记录,例如 0 - 9 条记录。
- 它成功处理了所有记录。
- 它向 Kafka 调用 commitAsync() 以提交最后一个偏移量。
- 提交响应正在处理中。它可以是成功的,也可以是失败的。
- 但是,由于它是异步模式,它会继续轮询下一批。
- 现在,Kafka 或消费者民意调查如何知道它必须从第 10 个位置读取?因为 commitAsync 请求还没有完成。
请帮助我理解这个概念。
解决方案
Commit Offset 告诉broker消费者已经成功处理了相应的消息。消费者本身会知道它的进度(除了消费者的开始,它从经纪人那里获得最后提交的偏移量)。
在您的描述中的第 5 步,提交偏移量正在进行中。所以:
- Broker 不知道0-9 条记录已被处理
- 消费者本身已读取消息,因此它知道已读取 0-9 条消息。所以它会知道接下来从第 10 个开始阅读。
可能的情况
- 假设提交失败(0-9)。你的下一批,比如 (10-15) 被成功处理和提交,那么就没有造成任何伤害。由于我们向代理标记到 15 的处理已完成。
- 假设提交失败(0-9)。您的下一批 (10-15) 已处理,并且在提交之前,消费者已关闭。当您的消费者重新启动时,它会从代理获取其状态(这两个批次都没有提交)。所以它将从第 0 条消息开始读取。
您还可以提出其他几种方案。我想底线是,当您的消费者因任何原因重新启动并且它已从 kafka 代理获得其最后处理的偏移量时,提交的重要性就会显现出来。
推荐阅读
- javascript - 使用滑动滑块垂直滑块模式无法正确计算可见幻灯片计数
- android - 上传 2 张图片时无法访问的语句
- postgresql - 如何在postgres(sql文件)中的do块内设置变量
- apache-spark - 想要使用 spark 连接到 smb 服务器并在 spark 中从该服务器加载文件.. 让我们说
- java - 通过 FXML 在状态栏中添加按钮
- php - 为什么我上传的图片没有显示在我的 Laravel 网站上?
- reactjs - 输入reactjs时如何屏蔽字符串
- firebase - 错误:HTTP 错误:403,调用者没有权限 - 在颤振中创建云函数时
- postgresql - psql - 无法执行命令 - 权限被拒绝错误
- r - R RefClass 从列表继承