kafka:线上问题记录

文章讨论了CPU占用过高可能是由于Kafka消费者重平衡导致的,建议调整poll消费参数并优化业务逻辑。对于消费者异常退出的问题,由于原因未明,提出了通过定时任务进行消费者自检和自动重启的解决方案。
摘要由CSDN通过智能技术生成

一、CPU占用过高

应用进程报CPU占用过高,且查看后台的日志解析生成速度较慢,加上日志出现重平衡分配等词,所以推测是重平衡导致CPU升高,而心跳和网络非常正常,又没有掉线或重启的应用,因此推测是poll消费时长过长导致消费被认为掉线引起重平衡。

解决方案如下:

1、调整poll消费参数:

max.poll.interval.ms: 600000
max.poll.records: 300

即一条消息平均有2秒钟的消费时长,不像默认设置的300000/500,即0.6秒要处理完一条消息,碰到部分复杂场景的数据消费时长就比较长了,平均0.6秒的消费时长风险还是比较大。

2、优化业务逻辑:调整业务逻辑,将消费逻辑简化,部分复杂场景数据后续用定时任务解决。

二、消费者异常退出

这个异常退出很诡异,只出现过一次,日志也没有异常,目前没有找到原因,估计是硬件内存等原因导致。后面紧急变更应用重启解决了。但应用重启在线上非常麻烦,因此解决方案就是消费者加上定时任务自检以及自动重启。

解决方案如下:

主体写三个类,一个是配置类,用于读取kafka消费者配置,并在启动应用时创建消费者,第二个是消费者线程类,用于将消费者传给线程启动进行轮询,第三个是编写定时任务,自检消费线程是否正常,若不正常则删除新建消费者。定时任务代码如下:

package com.longqi.bootkafka.component.job;

import cn.hutool.core.collection.CollectionUtil;
import com.longqi.bootkafka.component.KafkaConsumerRunner;
import com.longqi.bootkafka.config.KafkaConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author LongQi
 * @projectName boot-integration
 * @description: 消费者自检重启
 * @date 2023/3/20 19:58
 */

@Slf4j
@Component
public class KafkaConsumerManageJob {

    @Autowired
    private KafkaConfig kafkaConfig;

    @Scheduled(cron ="0 0/10 * * * ?")
    public void checkConsumer(){
        log.info("消费者自检...");
        Map<String,Thread> threads = kafkaConfig.getConsumerThreads();
        if(CollectionUtil.isEmpty(threads)){
            log.error("消费者全部宕机,这里重启!");
            kafkaConfig.createConsumer(null);
        }else{
            Integer bootNumber = 0;
            for(String key:threads.keySet()){
                if(threads.get(key) == null || !threads.get(key).isAlive()){
                    bootNumber++;
                    if(kafkaConfig.getConsumerRunners() !=null && kafkaConfig.getConsumerRunners().get(key) !=null){
                        KafkaConsumerRunner runner = kafkaConfig.getConsumerRunners().get(key);
                        // 停止轮询
                        runner.stopRun();
                        try {
                            // 注意这里睡眠时间一定要大于提交offest的时间,不然会报kafka多线程的错误
                            Thread.sleep(6000);
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                        if(runner.getConsumer() != null){
                            runner.getConsumer().close();
                        }
                        kafkaConfig.getConsumerRunners().remove(key);
                    }
                    if(threads != null){
                        threads.remove(key);
                    }
                }
                log.error("异常消费者[{}]已删除",key);
            }
            kafkaConfig.createConsumer(bootNumber);
            log.error("已新建{}个消费者",bootNumber);
        }
        log.info("消费者自检完毕");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时间在手上,需要抓住

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

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

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

打赏作者

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

抵扣说明:

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

余额充值