4.1 Kafka Consumer API之自动提交偏移量

本文介绍了Kafka消费者提交位移的概念,包括自动提交和手动提交的细节。自动提交可能导致重复消费,而手动提交能更好地控制消费进度。代码示例展示了自动提交的配置及其实现,当消费者重启时,可以从上次提交的位移处继续消费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简介
(1).概述
从用户的角度来说,位移提交分为自动提交和手动提交。

(2).提交位移
consumer需要向kafka汇报自己的位移数据,这个汇报过程被称为提交位移。因为consumer能够同时消费多个分区的数据,所以位移的提交实际上是在分区粒度上进行的,即consumer需要为分配给它的每个分区提交各自的位移数据。
提交位移主要是为了表示consumer的消费进度,这样当consumer发生故障重启之后,就能够从kafka中读取之前提交的位移值,然后从相应的位移处继续消费,从而避免整个消费过程重来一遍。

(3).自动提交
enable.auto.commit为true时表示自动提交,kafka会保证在开始调用poll方法时,提交上次poll返回的所有消息。从顺序上来说,poll方法的逻辑是先提交上一批消息的位移,再处理下一批消息,因此它能保证不出现消费丢失的情况。但自动提交位移的一个问题在于,它可能会出现重复消费。
在默认情况下,consumer每5秒自动提交一次位移。假设提交位移之后的3秒发生了rebalance操作。在rebalance之后,所有consumer从上一次提交的位移处继续消费,但该位移已经是3秒前的位移数据了,故在rebalance发生前3秒消费的所有数据都要重新再消费一次。虽然能够通过减少auto.commit.interval.ms的值来提高提交频率,但这么做只能缩小重复消费的时间窗口,不可能完全消除它。

2.代码示例

public class ConsumerSample {
    private static final String topicName = "steven";

    public static void main(String[] args) {
        //Consumer配置
        Properties props = new Properties();
        props.setProperty("bootstrap.servers", "127.0.0.1:9092");
        props.setProperty("group.id", "test");
        props.setProperty("enable.auto.commit", "true");
        props.setProperty("auto.commit.interval.ms", "1000");
        props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        //Consumer的主对象
        KafkaConsumer<String, String> consumer = new KafkaConsumer(props);
        //消费哪一个topic或者几个topic
        consumer.subscribe(Arrays.asList(topicName));
        while (true) {
            //批量拉取消息(每1000ms)
            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());
            }
        }
    }
}

这种方式在工作中一般不会使用,原因是消费kafka消息做业务处理时可能会出现消费失败的情况,那么处理失败的消息便无法再次消费,从而影响业务流程。

3.代码运行结果
(1).控制台输出
运行异步发送示例代码向kafka发送10条数据,然后再执行ConsumerSample代码进行消费,便可在控制台看见代码中指定的输出信息。停止ConsumerSample后,再次运行ConsumerSample,发现不会消费到任何消息,这是因为kafka自动提交了offset。

partition = 0,offset = 0,key = key-0,value = value-0
partition = 0,offset = 1,key = key-1,value = value-1
partition = 0,offset = 2,key = key-2,value = value-2
partition = 0,offset = 3,key = key-3,value = value-3
partition = 0,offset = 4,key = key-4,value = value-4
partition = 0,offset = 5,key = key-5,value = value-5
partition = 0,offset = 6,key = key-6,value = value-6
partition = 0,offset = 7,key = key-7,value = value-7
partition = 0,offset = 8,key = key-8,value = value-8
partition = 0,offset = 9,key = key-9,value = value-9

(2).终端输出
打开一个cmd终端,在E:\Kafka\kafka_2.12-1.1.0\bin\windows目录下执行kafka-console-consumer.bat --zookeeper localhost:2181 --topic steven,可以看到生产的消息。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值