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

相关推荐
Mr_wilson_liu16 小时前
往kafka创建生产者和消费者,并且打数据和消费数据
kafka
SirLancelot117 小时前
MongoDB-基本介绍(一)基本概念、特点、适用场景、技术选型
java·数据库·分布式·后端·mongodb·软件工程·软件构建
koping_wu17 小时前
【Kafka】架构原理、消息丢失、重复消费、顺序消费、事务消息
分布式·架构·kafka
熊文豪17 小时前
Windows安装Apache Kafka保姆级教程(图文详解+可视化管理工具)
windows·kafka·apache
小醉你真好17 小时前
16、Docker Compose 安装Kafka(含Zookeeper)
docker·zookeeper·kafka
柳贯一(逆流河版)1 天前
Redis 分布式锁实战:解决马拉松报名并发冲突与 Lua 原子性优化
redis·分布式·lua
小醉你真好1 天前
Spring Boot + Kafka 全面实战案例
spring boot·kafka·linq
ajax_beijing1 天前
hadoop的三副本数据冗余策略
大数据·hadoop·分布式
失散131 天前
分布式专题——46 ElasticSearch高级查询语法Query DSL实战
java·分布式·elasticsearch·架构
沉默终止1 天前
Kafka Queue: 如何严格控制消息数量
kafka