Kafka学习笔记六:kafka消费者自动提交和手动提交

1.提交的内容:

消费者无论时自动提交还是手动提交,都需要把所属的消费组+消费的某个主题+消费的某个分区及消费的偏移量,这样的信息提交到集群的_consumer_offset主题里面

2.自动提交offset(偏移量):

消息poll下来之后直接提交offset到_consumer_offset主题中

自动提交会丢失消息:因为如果poll下来之后 还没有消费 然后马上提交了offset 提交上去以后消费者挂了

3.手动提交offset:

  • 手动同步提交:消费完消息后,调用同步提交方法,当集群返回ack前一直阻塞,返回ack后表示提交成功,然后执行之后的逻辑
  • 手动异步提交:在消息消费完后,不需要等到集群ack,直接执行之后的逻辑,可以设置一个回调的方法
//有消息
if(records.count() > 0){
    //手动提交offset,当前线程会阻塞直到offset提交成功
    //一般使用同步提交,因为提交之后一般也没有什么逻辑代码了
    //手动同步提交
    consumer.commitSync();

    //手动异步提交offset,当前线程提交offset不会阻塞,可以继续处理后面的程序逻辑
    consumer.commitAsync(new OffsetCommitCallback() {
        @Override
        public void onComplete(Map<TopicPartition, OffsetAndMetadata> map, Exception e) {
            if(e != null){
                System.err.println("Commit falide for"+ map);
                System.err.println("Commit falide exception"+ e.getStackTrace());
            }
        }
    });
}

消费者代码根据offset加入提交逻辑

package Consumer;

import org.apache.kafka.clients.consumer.*;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.serialization.StringSerializer;

import java.time.Duration;
import java.util.Arrays;
import java.util.Map;
import java.util.Properties;

/**
 * 消费者
 */
public class MyConsumer {

    private final static String TOPIC_NAME = "my-one-topic";
    //消费组
    private final static String CONSUMER_GROUP_NAME = "group-lzl";

    public static void main(String[] args) {
        Properties props  = new Properties();
        //设置broker集群ip
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"123.60.111.191:9091");
        //是否自动offset,默认为true
        props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,"false");
        //自动offset的间隔时间
        props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG,1000);
        //消费分组名
        props.put(ConsumerConfig.GROUP_ID_CONFIG,CONSUMER_GROUP_NAME);
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

        //创建一个消费者的客户端
        KafkaConsumer<String,String> consumer = new KafkaConsumer<String, String>(props);
        //消费者订阅主题列表
        consumer.subscribe(Arrays.asList(TOPIC_NAME));

        while (true){
            ConsumerRecords<String,String> records =  consumer.poll(Duration.ofMillis(1000));
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("收到消息:partition = %d,offset = %d,key = %s ,value = %s%n",
                        record.partition(),record.offset(),record.key(),record.value());
            }

            //有消息
            if(records.count() > 0){
                //手动提交offset,当前线程会阻塞直到offset提交成功
                //一般使用同步提交,因为提交之后一般也没有什么逻辑代码了
                //手动同步提交
                consumer.commitSync();

                //手动异步提交offset,当前线程提交offset不会阻塞,可以继续处理后面的程序逻辑
                consumer.commitAsync(new OffsetCommitCallback() {
                    @Override
                    public void onComplete(Map<TopicPartition, OffsetAndMetadata> map, Exception e) {
                        if(e != null){
                            System.err.println("Commit falide for"+ map);
                            System.err.println("Commit falide exception"+ e.getStackTrace());
                        }
                    }
                });
            }
        }

    }

}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只不秃头的小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值