动态启停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数据

相关推荐
不光头强3 小时前
kafka学习要点
分布式·学习·kafka
编程彩机3 小时前
互联网大厂Java面试:从分布式缓存到消息队列的技术场景解析
java·redis·面试·kafka·消息队列·微服务架构·分布式缓存
難釋懷3 小时前
分布式锁-redission可重入锁原理
分布式
珠海西格3 小时前
远动通信装置为何是电网安全运行的“神经中枢”?
大数据·服务器·网络·数据库·分布式·安全·区块链
CTO Plus技术服务中4 小时前
分布式存储HBase开发与运维教程
运维·分布式·hbase
indexsunny4 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa
飞乐鸟6 小时前
Github 16.8k Star!推荐一款开源的高性能分布式对象存储系统!
分布式·开源·github
panzer_maus6 小时前
分布式锁的概念
分布式
Lansonli7 小时前
大数据Spark(七十九):Action行动算子countByKey和countByValue使用案例
大数据·分布式·spark
少许极端8 小时前
Redis入门指南(八):从零到分布式缓存-集群机制、缓存机制、分布式锁
redis·分布式·缓存·分布式锁