kafka-demo 7 偏移量

本文探讨了Kafka消费者在处理消息时的偏移量管理,包括同步与异步组合提交偏移量以确保在关闭消费者前的成功提交,如何提交特定的偏移量以实现更灵活的提交策略,以及如何从特定偏移量开始处理记录,从而避免数据重复或丢失。
摘要由CSDN通过智能技术生成

7 偏移量

代码地址:https://github.com/luslin1711/kafka_demo/tree/master/kafka_demo_07

一、同步与异步组合提交偏移量

一般情况下,针对偶尔出现的提交失败,不进行重试不会有太大问题,因为如果提交失败是因为临时原因导致的,那么后续的提交总会有成功的。但如果这是在关闭消费者前的最后一次提交,就要确保能够提交成功

因此,在消费者关闭前一般会组合使用commitAsync() 与commitSync()

public void run() {
   
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties, new StringDeserializer(), new StringDeserializer());
        try {
   
            consumer.subscribe(Collections.singletonList(topic));
            while (true) {
   
                ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
                if (records.isEmpty()) continue;
                System.out.println("recordsLen: " + records.count());
                for ( ConsumerRecord <String, String> record : records ) {
   
                    System.out.println("threadId: " + Thread.currentThread().getName() +" ,groupId: " + groupId +", partition: " + record.partition());
                }
                consumer.commitAsync();
            }
        } catch (WakeupException E) {
   
            // 忽略异常,关闭消费者
        } catch (Exception e) {
   
            e.printStackTrace();
        }finally {
   
            try {
   
                consumer.commitSync();
            } finally {
   
                consumer.close();
            }
        }
    }

如果一切正常,我们使用consumer.commitAsync()方法来提交。这样速度更快,而且即使这次提交失败,下次提交也可能会成功

如果直接关闭消费者,那就没有所谓的“下一次提交”了。使用consumer.commitSync()方法会一直重试,直到提交成功或者发生无法恢复的错误

二、提交特定的偏移量

提交偏移量的频率与处理消息批次的频率是一样的。但如果想要更频繁地提交该怎么办?如果poll方法返回了一大批数据,为了避免再均衡导致重复处理整批消息,想要在批次中间提交该怎么办?这种情况无法通过commitAsync()进行提交,因为它只会提交 最后一个偏移量,而此时该批次里的消息还没有处理完。

可以在commitAsync()时传入希望提交的分区和偏移量的map

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.clients.consumer.OffsetAndMetadata;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.errors.WakeupException;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.time.Duration;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;


public class Consumer implements Runnable{
   


    protected String groupId;
    protected String topic;
    protected Properties properties;
    private Map<TopicPartition, OffsetAndMetadata> currentOffsets = new HashMap<>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值