动态启停kafka消费者

Kafka中如何动态开启、关闭消费者

使用背景:在开发业务中需要根据具体逻辑选择开启还是关闭消费者

实现逻辑:

1、创建consumer配置类,自定义工厂、自定义消费者配置(省略)

还需要注入consumerService bean(改类里主要是控制动态启停的具体实现方法)

2、接口实现

复制代码
public class ConsumerKafkaService {
   
    private final  Kafka  KafkaListenerEndpointRegistry registry;

    //暂停消费topic
    public  void  pauseTopic(String topic){
   
          MessageListenerContainer  container =getContainer();
          if(Objects.nonNull(container) && container.isRunning() ){
                //取对应topic
                Collection<TopicPartition>  partitions = getTopicPartitions(container);
                partitions.stream.filter(p -> p.topic().contains(topic)).forEach(partition -> {
                if(!container.isPartitionPaused(partition)){
                     container.pausePartition(partition);   
                      log.info("partition:{} 停止消费",partition);
                 }
                });
            } 
        }

    //获取对应topic和分区集合
    private static  Collection<TopicPartition>  getTopicPartitions(MessageListenerContainer  container){
         return Optional.ofNullable(container.getAssignedPartitions()).orElseGet(Collections::emptyList);
    }

    //开启消费
    public  void  resumeTopic(String topic){
   
          MessageListenerContainer  container =getContainer();
          if(Objects.nonNull(container) && container.isRunning() ){
                //取对应topic
                Collection<TopicPartition>  partitions = getTopicPartitions(container);
                partitions.stream.filter(p -> p.topic().contains(topic)).forEach(partition -> {
                if(!container.isPartitionPaused(partition)){
                    container.resumePartition(partition);   
                    log.info("partition:{} 开启消费",partition);
                  }
               });
          } 
      }

    //根据指定id获取容器
    private  MessageListenerContainer   getContainer(){
         return  registry.getListenerContainer("XXX");
   }

    //首次执行,初始化
    public void initPause(){

         MessageListenerContainer  container =getContainer();
         if(Objects.nonNull(container) && container.isRunning() ){
                //取对应topic
                Collection<TopicPartition>  partitions = getTopicPartitions(container);
                partitions.forEach(partition -> {
                if(PlatformCache.availableTopics.contains(partition.topic())){
                     if(container.isPartitionPaused(partition)){
                            container.resumePartition(partition);   
                            log.info("partition:{} 开启消费",partition);
                    }
                 }else{   
                     container.pausePartition(partition);   
                     log.info("partition:{} 暂停消费",partition);
                }
              });
         } 
    }
}

消费监听方法上,@KafkaListener(topicPattern="${topicPattern}",id="XXX",idIsGroup = false)即可监听开启消费的topic数据

相关推荐
月落归舟6 小时前
从单机到分布式:互联网系统架构演进全流程
分布式·系统架构
搬砖柯7 小时前
系列12-接口压测怎么做成平台能力?自研 httpx 引擎、分布式 Worker 与 Locust 选型对照
分布式·测试工具·性能优化·开源·自动化·httpx
折哥的程序人生 · 物流技术专研7 小时前
Java面试通关⑭:分布式理论与架构全集
分布式·微服务·校招·分布式事务·cap·java面试·最终一致性
Kyrie_Li18 小时前
Spring Boot Kafka 生产级配置全解析:从入门到精通
spring boot·后端·kafka
格子软件19 小时前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
Evand J1 天前
【论文复现】MATLAB例程,存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》
开发语言·分布式·matlab·定位·导航·wsn
格子软件1 天前
2026年分布式GEO代理流量调度:源码级状态机防重挂实战
java·vue.js·人工智能·spring boot·分布式·vue
2301_801184751 天前
kafka-zookeeper
分布式·zookeeper·kafka
Devin~Y1 天前
抖音级短视频推荐与直播带货平台面试实战:从 Java 微服务到 RAG 智能客服全链路解析
java·spring boot·redis·spring cloud·kafka·agent·rag
大明者省1 天前
四大模态大模型训练体系全解析(架构+范式+分布式+算力成本·)
笔记·分布式·架构