springboot集成整合kafka-批量消费、并发消费

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

由于Kafka的写性能非常高,因此肯定会碰到Kafka消息队列拥堵的情况。遇到这种情况,我们可以通过并发消费、批量消费的方法进行解决。

之前配置生产者我没有在yml文件中直接配置,而是新建了一个配置类,在配置类中配置生产者,这样确实有点麻烦了,所以消费者就直接在yml进行配置了。

先看下批量消费,想要批量消费,首先要开启批量消费,通过listener.type属性设置为batch即可开启,看下代码吧:

spring:
  kafka:
    consumer:
      group-id: test-consumer-group
      bootstrap-servers: 118.190.152.59:9092
      max-poll-records: 5 # 一次 poll 最多返回的记录数
    listener:
      type: batch # 开启批量消费

如上:如上设置了启用批量消费和批量消费每次最多消费记录数。这里设置 max-poll-records是5,并不是说如果没有达到5条消息,我们就一直等待。而是说一次poll最多返回的记录数为5。

配置好后,接着对消费者监听这边代码稍作修改,改成使用 List 来接收:

    @KafkaListener(topics = {"mytopic"})
    public void consumer(List<String> message){
        System.out.println("接收到的消息:" + message);
    }

如果使用ConsumerRecord类接收,也是一样的使用 List 来接收,就不贴代码了。

新增测试方法测试下效果:

    @Transactional
    @GetMapping("/send13")
    public void test13() {
        for (int i = 0; i < 23; i++) {
            kafkaTemplate.send(topic, "msg-" + i);
        }
    }

启动项目,访问http://localhost:8080/send13 结果如下: 

再来看下并发消费,为了加快消费,我们可以提高并发数,比如下面配置我们将并发设置为 3。注意:并发量根据实际分区数决定,必须小于等于分区数,否则会有线程一直处于空闲状态

spring:
  kafka:
    consumer:
      group-id: test-consumer-group
      bootstrap-servers: 118.190.152.59:9092
      max-poll-records: 5 # 一次 poll 最多返回的记录数
    listener:
      type: batch # 开启批量监听
      concurrency: 3 # 设置并发数

我们设置concurrency为3,也就是将会启动3条线程进行监听,而要监听的topic有5个partition,意味着将有2条线程都是分配到2个partition,
还有1条线程分配到1个partition。

看下项目启动日志:

如上:有一个线程监听3,2分区,一个线程监听4,另一个线程监听1,0分区。感兴趣的小伙伴可以测试下消费信息的效率。

补充一下:

像之前配置生产者一样,通过自定义配置类的方式也是可以的,但是相对yml配置来说还是有点麻烦的,直接贴下代码记录一下:

/**
 * 消费者配置
 */
@Configuration
public class KafkaConsumerConfig {

    /**
     * 消费者配置
     * @return
     */
    public Map<String,Object> consumerConfigs(){
        Map<String,Object> props = new HashMap<>();
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-consumer-group");
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "your ip:9092");
        props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 5);
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        return props;
    }

    @Bean
    public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, Object>> batchFactory() {
        ConcurrentKafkaListenerContainerFactory<String, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(new DefaultKafkaConsumerFactory<>(consumerConfigs()));
        //并发数量
        factory.setConcurrency(3);
        //开启批量监听
        factory.setBatchListener(true);
        return factory;
    }
}

同时监听器通过@KafkaListener注解的containerFactory 配置指定批量消费的工厂即可,如下:

    @KafkaListener(topics = {"mytopic"},containerFactory = "batchFactory")
    public void consumer(List<String> message){
        System.out.println("接收到的消息:" + message);
    }

补充:

对于的理解可能有问题,评论区中的大佬Nice_Jason进行了说明,感兴趣的自己再研究下。

<think>好的,我现在需要帮助用户了解如何在Spring Boot集成Kafka以实现消息消费。首先,我应该回顾用户提供的引用内容,确保回答准确。用户提供了四个引用,其中提到了配置消费者、动态创建消费者、生产者和消费者的使用方法,以及运行Zookeeper和Kafka服务器的步骤。 第一步,我需要整理出一个清晰的步骤指南。根据引用1,首先要配置和运行Zookeeper和Kafka服务器。然后,引用2和3提到在Spring Boot配置文件中设置消费者参数,比如group id和auto offset reset。同时,引用3还提到了导入依赖包、发送和接收消息的方法。引用4讨论了动态创建消费者的问题,但用户的问题主要是基础配置和使用,所以可能暂时不需要深入动态部分,但可以简要提及。 接下来,我需要确保按照用户的要求使用正确的中文和LaTeX格式。例如,变量或配置项如`group-id`应该用$group-id$表示,但根据示例,可能需要用行内代码块更合适,或者根据系统级指令,数学表达式才用$...$。这里配置项属于代码,应该用反引号包裹,比如`group-id`。 然后,用户要求生成相关问题,我需要根据教程内容提出相关的问题,例如性能优化、配置参数作用、多消费者处理等。 在结构上,按照用户示例,先分步骤讲解,包括依赖添加、配置文件设置、消费者监听器的编写、运行服务器和测试。每个步骤需要结合引用内容,比如在配置文件中设置参数时引用[2]和[3]。同时,代码示例要正确,比如使用@KafkaListener注解,并指出其局限性,引用[4]提到动态创建的问题。 最后,检查是否所有引用都被正确标注,例如在提到配置参数时引用[2],在运行服务器步骤引用[1]。确保没有遗漏关键步骤,比如启动Zookeeper和Kafka服务器,这是消费消息的前提条件。 可能需要注意用户提到的系统级指令中的第5点,生成相关问题,所以需要围绕教程内容提出三个相关问题,例如配置参数的作用、多主题消费的方法、以及如何处理消费异常。 总结整个思考过程,需要将各个引用内容整合到步骤中,确保每个步骤都有对应的引用支持,同时保持回答结构清晰,符合用户的要求。</think>### Spring Boot集成Kafka消费者配置与使用教程 #### 1. 环境准备与依赖配置 - **步骤1**:在`pom.xml`中添加Kafka依赖: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 此依赖提供了Spring BootKafka集成支持[^3]。 - **步骤2**:配置Kafka消费者参数(`application.yml`): ```yaml spring: kafka: bootstrap-servers: localhost:9092 consumer: group-id: my-consumer-group auto-offset-reset: earliest key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer ``` 其中: - `group-id`定义消费者组,同一组内消费者共享消息负载[^2]; - `auto-offset-reset: earliest`表示从最早未消费的偏移量开始读取。 #### 2. 实现消息监听 ```java @Component public class KafkaConsumer { @KafkaListener(topics = "my-topic") public void receiveMessage(String message) { System.out.println("Received: " + message); } } ``` - 使用`@KafkaListener`注解监听指定主题,支持多主题如`topics = {"topic1", "topic2"}`; - 默认情况下,消费者为静态配置,若需动态创建需扩展`ConcurrentKafkaListenerContainerFactory`[^4]。 #### 3. 运行与测试 - **步骤1**:启动Zookeeper与Kafka服务器[^1]: ```bash # 启动Zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties # 启动Kafka bin/kafka-server-start.sh config/server.properties ``` - **步骤2**:使用Kafka生产者发送消息: ```java @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } ``` - **步骤3**:启动Spring Boot应用,消费者将自动订阅并消费消息。 --- ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值