kafka手动提交offset
转:https://www.cnblogs.com/simple-li/p/16149862.html
手动提交offset
手动提交offset的方法有两种:分别是commitSync(同步提交)和commitAsync(异步提交)。
相同点:都会将本次提交的一批数据最高的偏移量提交
不同点:
同步提交:阻塞当前线程,一直到提交成功,并且会自动失败重试(由不可控因素导致,也会出现提交失败);
异步提交:没有失败重试机制,故有可能提交失败。
• commitSync(同步提交):必须等待offset提交完毕,再去消费下一批数据。
• commitAsync(异步提交):发送完提交offset请求后,就开始消费下一批数据。
关键字
properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,false); // 是否开启自动提交offset
kafkaConsumer.commitAsync(); // 异步提交
kafkaConsumer.commitSync(); // 同步提交
实现代码
package com.lzh.kafka; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.TopicPartition; import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.ArrayList; import java.util.Properties; // kafka消费者手动提交offset public class CustomConsumer手动同步提交offset { public static void main(String[] args) { // 0 配置 Properties properties = new Properties(); // 连接到服务器 properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"bigdata01:9092,bigdata02:9092"); // 反序列化 properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName()); // 添加消费者组groupid,必须 properties.put(ConsumerConfig.GROUP_ID_CONFIG,"test"); /* 自动提交配置 // 是否自动提交 offset properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,true); // 提交 offset 的时间周期 1000ms,默认 5s properties.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG,1000); */ // 是否手动提交 offset properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,false); // 1 创建一个消费者对象 KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(properties); // 2 订阅主题 ArrayList<String> topics = new ArrayList<String>(); topics.add("Mytopic"); kafkaConsumer.subscribe(topics); // 注册要消费的主题(可以消费多个主题) // 3 消费数据 // 一直获取消费数据 while (true){ ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1)); for (ConsumerRecord<String, String> consumerRecord : consumerRecords) { System.out.println(consumerRecord); } // 手动提交offset // kafkaConsumer.commitAsync(); // 异步提交 kafkaConsumer.commitSync(); // 同步提交 } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通