kafka问题

本文探讨了Kafka生产者如何防止消息丢失,通过设置标志和使用ListenableFutureCallback监听确保消息发送成功并重试。消费者方面,通过手动维护偏移量确保消息不被重复消费。同时,文章详细介绍了Kafka的偏移量管理,包括手动提交和回滚offset,以及ack设置的不同级别,帮助用户在可靠性和延迟之间做出权衡。

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

   kafkaTemplate.send(
                invoiceEtcTradeTopic,
                    jsonMsg
            ).addCallback(new ListenableFutureCallback<SendResult<String, String>>(){
                @Override
                public void onFailure(Throwable ex) {
                    log.error("发送消息失败:{}",ex.getMessage());
                }

                @Override
                public void onSuccess(SendResult<String, String> result) {
                    String topicName = result.getRecordMetadata().topic();
                    int num = result.getRecordMetadata().partition();
                    long offset = result.getRecordMetadata().offset();
                    log.info("发送消息成功:topic={},partition={},offset={}",topicName,num,offset);
                  
                    if(numOrder[0] == 1){
                        log.info("");
                    }else{
                        log.info("");
                    }
                }
            });

生产问题解决

生产者防止消息丢失,设置表。标识flag来标识是否发送成功。

利用spring的ListenableFutureCallback监听,onsuccess时修改表标识为1成功,onFailure时修改标识为0发送失败。

为0的定时重发消息,重发的消息成功了进onsuccess中,然后改标识

消费者接收之前存表。消息来了先从表里查询,没查询到数据,则重新消费。消费成功,手动提交偏移量。

查到数据了,直接手动提交偏移量。

多次消费不成功,设置阈值。

偏移量

1 手动提交 当 auto.commit.enable 设置为false时,表示kafak的offset由消费者手动维护,spring-kafka提供了通过ackMode的值表示不同的手动提交方式;

ackMode有以下7种值:

// 当每一条记录被消费者监听器(ListenerConsumer)处理之后提交
        RECORD,

        // 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后提交
        BATCH,

        // 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,距离上次提交时间大于TIME时提交
        TIME,

        // 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,被处理record数量大于等于COUNT时提交
        COUNT,

        // TIME | COUNT 有一个条件满足时提交
        COUNT_TIME,

        // 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后, 手动调用Acknowledgment.acknowledge()后提交
        MANUAL,

        // 手动调用Acknowledgment.acknowledge()后立即提交
        MANUAL_IMMEDIATE,

如果设置 AckMode 模式为 MANUAL 或者 MANUAL_IMMEDIATE,则需要对监听消息的方法中,引入 Acknowledgment 对象参数,并调用 acknowledge() 方法进行手动提交;如果没有提交程序重启后会重复消费;其他模式满足条件就会提交(不是严格意义上的手动),不需要调用acknowledge() 。

2 回滚offet 处理数据报错时记下offset,重置offset就会重复消费。

TopicPartition topicPartition = new TopicPartition(topic, partition);

ack设置

ack 应答机制 对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失, 所以没必要等 ISR 中的 follower 全部接收成功。 所以 Kafka 为用户提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡, 选择以下的配置。 acks 参数配置: acks: 0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还 没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据; 1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower 同步成功之前 leader 故障,那么将会丢失数据 -1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower (ISRL里的follower,不是全部的follower)全部落盘成功后才 返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会造成数据重复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值