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

相关推荐
Charlie__ZS6 小时前
RabbitMQ
分布式·rabbitmq
桑榆08066 小时前
spark-core编程2
大数据·分布式·spark
可乐仙人7 小时前
常见MQ及类MQ对比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ
redis·kafka·rocketmq
光亮的程序猿7 小时前
confluent-kafka入门教程
python·kafka
小袁拒绝摆烂10 小时前
Redis-高级篇(分布式缓存/持久化)
redis·分布式·缓存
精神内耗中的钙奶饼干11 小时前
Windows 系统搭建Kafka集群记录
后端·kafka
架构文摘JGWZ11 小时前
Apache Kafka UI :一款功能丰富且美观的 Kafka 开源管理平台!!
ui·kafka·开源·apache·工具
精神内耗中的钙奶饼干12 小时前
Windows 系统上安装和使用 Apache Kafka记录
大数据·kafka
帝锦_li14 小时前
微服务1--服务架构
分布式·微服务·系统架构
星辰瑞云15 小时前
Spark-SQL核心编程2
大数据·分布式·spark