Kafka消费者不停机参数调整思路简单实现

本文介绍了如何在不中断服务的情况下,对Kafka消费者进行参数调整。包括禁止自动启动Consumer容器、动态控制消费集群、调整并发数量。通过结合SpringBoot、Apollo配置中心,实现在运行时动态调整消费者的启动状态和并发数,从而优化消费能力。
摘要由CSDN通过智能技术生成

背景

最近团队的小伙伴反馈了几个关于kafka消费者的问题

  1. 项目监听了几十个topic,启动时都需要进行初始化,很多时候本地调试时根本不需要启动消费者,但却被迫进行初始化,希望能优化这个问题。
  2. 由于我司在每个环境上,都区分了不同集群(如01、02、03等),来满足并行开发不同需求使用。但目前kafka并未根据不同集群做区分,导致partition消息无法被指定的某个集群消费,例如原本希望被集群01消费的消息,却被集群03消费了,所以希望能服务运行时动态控制不同集群消费者是否开启;
  3. kafka的topic调整partition数量后,消费者服务在不增加实例的前提下,想调整消费者服务的并发数只能手动修改代码后重新部署,非常麻烦,所以希望能在服务运行时动态调整消费者的并发数量,提高消费能力;

分析

我司项目都是基于SpringBoot,消费者使用@KafkaListener注解实现监听。

问题1

由于@KafkaListenr注解被KafkaListenerAnnotationBeanPostProcessor扫描,在postProcessAfterInitialization方法被解析后构造Consumer容器,且autoStartup属性默认为true,所以会自动启动。

要禁止自动启动Consumer容器比较简单,只要将Consumer容器设置成不自动启动即可,有以下解决方案:

  • 在@KafkaListener注解指定autoStartup属性为false,该方法只针对使用注解的方法;
  • 在@KafkaListener注解指定containerFactory属性,该属性值指向AbstractKafkaListenerContainerFactory实现类的实例,实例可以设置autoStartup属性为false;

在本地调试环境时可以将autoStartup属性设置为默认false不启动Consumer容器,但是在其他环境,还是需要启动Consumer容器的,所以就有以下两种方案

  • 利用不同环境的配置文件,根据配置值来决定是否启动Consumer容器(@KafkaListener的autoStartup支持SpEL);
  • 指定AbstractKafkaListenerContainerFactory的autoStartup为false,集成Apollo配置中心,并且在Spring容器完全启动成功后,再根据配置中心文件判断是否需要对Consumer容器进行start;

问题2

kafka通过Rebalance协议来规定一个Consumer Group下的所有Consumer如何达成一致,来分配订阅Topic的每个partition。

触发Rebalance的条件有3个:

  • Group组员发生变化,例如有Consumer加入或离开Consumer Group;
  • 订阅的Topic数量发生变化;
  • 订阅的Topic的partition数量发生变化;

综上可以得知,我们只需让指定集群的Consumer在启动的时候,不加入Consumer Group(不启动Consumer),或者在已经加入Consumer Group前提下离开Consumer Group即可,从而触发Rebalance机制,最终达到只让指定集群的Consumer消费的目的。

至于想要在服务运行时进行动态调整,只需接入Apollo配置中心,不同集群使用不同的配置文件即可。

问题3

@KafkaListener注解上的concurrency属性,用来指定Consumer的并发数量。

目前项目想调整Consumer的并发数量,只能通过手动修改的代码后重新发布,其目的本质上来讲,是修改

AbstractKafkaListenerContainerFactory实例上的concurrency属性,然后重启AbstractKafkaListenerContainerFactory实例(其实就是调用stop()方法后再调用start()方法),最终在启动的时候,消费者服务会根据concurrency启动相应数量的消费者。

至于想要在服务运行时进行动态调整,只需配合Apoll配置中心实现即可。

实现

在问题1的两种方案中,由于方案2可以更灵活控制,所以此处直接使用方案2

 

typescript

复制代码

@Bean(KAFKA_CONSUMER_FACTORY) public KafkaListenerContainerFactory<?> kafkaConsumerContainerFactory() {    Map<String, Object> properties = new HashMap<>();    //

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka是一种分布式流处理平台,可用于构建实时数据管道和流处理应用程序。Kafka消费者参数是指在消费者端配置的一些参数,用于控制消费者的行为和性能。 首先,消费者需要指定要消费的主题。可以通过设置"bootstrap.servers"参数来指定Kafka集群的地址。消费者还可以通过设置"group.id"参数来指定消费者所在的消费组,以便和其他消费者进行协调分配分区。 其次,消费者需要设置"auto.offset.reset"参数来控制消费者在启动时如何处理已提交的偏移量。可以设置为"earliest",表示从最早的可用偏移量开始消费;或者设置为"latest",表示从最新的偏移量开始消费。 还有一些其他的消费者参数可以配置。比如,可以设置"max.poll.records"参数来控制每次拉取的最大记录数;设置"enable.auto.commit"参数来控制消费者是否自动提交偏移量;设置"auto.commit.interval.ms"参数来控制自动提交偏移量的间隔时间。 此外,消费者还可以通过设置一些性能参数来优化消费者的性能。比如,可以设置"fetch.min.bytes"参数来控制每次拉取的最小字节数,以减少网络请求的频率;设置"max.partition.fetch.bytes"参数来控制每个分区每次拉取的最大字节数;设置"fetch.max.wait.ms"参数来控制拉取请求的等待时间。 最后,消费者还可以设置一些安全相关的参数,比如设置"security.protocol"参数来指定连接到Kafka集群时使用的安全协议。 综上所述,Kafka消费者参数的配置可以根据实际需求来设置,以提供更好的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值