kafka学习十三-消费者消费数据

1 自动提交的问题

1.1 消息丢失

由于自动提交是每隔一段时间提交一次,假如消费者拉到一批数据,刚处理一部分就提交了,然后挂掉了,这个时候未消费的那批数据就彻底丢失了,因为offset已经提交了,不会重新消费。

1.2 消息重复

同样的,消费者拉到一批数据,刚处理一部分没有提交,然后挂掉了,这个时候已经消费的那批消息会被再次消费。

2 手动消费问题

手动消费只会造成消息重复,不会造成消息丢失,消息重复原因和自动提交原因一样

3 代码实现

3.1 设置properties

public static KafkaConsumer<String, String> getConsumer() {
    // 开启自动提交
    properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, Boolean.FALSE);
    // 设置自动提交延迟
    // properties.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 1);
    properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    // 设置消费者组
    properties.put(ConsumerConfig.GROUP_ID_CONFIG, "demo-consumer");
    // 重置offset,更换消费者组或者之前消费的offset不存在了的时候有效
    // properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
    return new KafkaConsumer<>(properties);
}

3.2 消费者消费数据

private KafkaConsumer<String, String> consumer = KafkaUtil.getConsumer();

public void receiveMsg(String topic) {
    consumer.subscribe(Collections.singletonList(topic));
    while (true) {
        // 每隔100ms拉一次数据
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
        if (records.isEmpty()) {
            continue;
        }
        log.info("receive msg size:{}", records.count());
        for (ConsumerRecord<String, String> record : records) {
            log.info("receive msg, key:{}, value:{}, partition:{}, offset:{}",
                    record.key(), record.value(), record.partition(), record.offset());
        }
        consumer.commitAsync((map, e) -> {
            if (Objects.nonNull(e)) {
                log.error("commit error, map:{}, e:", map, e);
            }
        });
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值