Springboot使用kafka(配置篇yml)

本文详细介绍了SpringBoot中配置Kafka的相关参数,包括消费者和生产者的配置选项,如bootstrap-servers、group-id、acks等,以及消费者监听器的设置,如ack-mode和concurrency,这些配置对于理解和使用SpringBoot与Kafka集成至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)springboot kafka配置

1:spring.kafka.bootstrap-servers 配置kafak的broker地址,格式为 host:port,可以配置多个,用“,”隔开;

2:spring.kafka.client-id 发出请求时传递给服务器的ID,用于服务器端日志记录;

(二)消费者配置

3:spring.kafka.consumer.bootstrap-servers   配置kafak customer 的broker地址,格式为 host:port,可以配置多个,用“,”隔开;优先级比spring.kafka.bootstrap-servers高,当不设置时,使用spring.kafka.bootstrap-servers的值;

4:spring.kafka.consumer.client-id  发出请求时传递给服务器的ID,用于服务器端日志记录,不设置时,系统会自动生成;

5:spring.kafka.consumer.group-id  设置当前消费者所在组的名称;

6:spring.kafka.consumer.enable-auto-commit  消费者的消费记录offset是否后台自动提交;

7:spring.kafka.consumer.auto-commit-interval  当消费者的消费记录offset是否后台自动提交时,多长时间自动提交一次;

8:spring.kafka.consumer.auto-offset-reset  当Kafka中没有初始偏移量或服务器上不再存在当前偏移量时该怎么办,

  earliest:自动将偏移量重置为最早的偏移量;

  latest:自动将偏移量重置为最迟的偏移量;

  none:如果未找到消费者组的先前偏移量,则将异常抛出给消费者;

  exception:向消费者抛出异常;

9:spring.kafka.consumer.max-poll-records  一次调用poll()返回的最大记录数,默认是500;

10:spring.kafka.consumer.fetch-max-wait  当没有足够的数据(数据的大小不小于 fetch.min.bytes)返回给客户端时,服务器最大阻塞时间;

11:spring.kafka.consumer.fetch-min-size  服务器应为获取请求返回的最小数据量(以字节为单位)

12:spring.kafka.consumer.heartbeat-interval    消费者协调员之间心跳的预期时间(单位是毫秒)

13:spring.kafka.consumer.key-deserializer   消费者所有keys的序列化类,默认是 org.apache.kafka.common.serialization.StringDeserializer

14:spring.kafka.consumer.value-deserializer   消费者所有values的序列化类,默认是 org.apache.kafka.common.serialization.StringDeserializer 

15:spring.kafka.consumer.properties    消费者其他属性配置,类型 java.util.Map<java.lang.String,java.lang.String>;       

(三)生产者配置

1:spring.kafka.producer.bootstrap-servers   配置kafak produce的broker地址,格式为 host:port,可以配置多个,用“,”隔开;优先级比spring.kafka.bootstrap-servers高,当不设置时,使用spring.kafka.bootstrap-servers的值;

2:spring.kafka.producer.client-id   发出请求时传递给服务器的ID,用于服务器端日志记录,不设置时,系统会自动生成;

3:spring.kafka.producer.acks  生产者要求数据有多少个副本接收到数据才算发送成功,类型是java.lang.String,

  “0” :表示生产者数据发送到leader就算写入成功,但是如果leader在把数据写到本地磁盘时报错,就会数据丢失,akcs设置为0时,kafka可以达到最大的吞吐量;

  “1":表示生产者数据发送到leader并写入到磁盘才算写入成功,但是如果数据在同步到其他副本时,leader挂了,其他副本被选举为新leader,那么就会有数据丢失;

  “-1”, “all“:表示生产者把数据发送到leader,并同步到其他副本,才算数据写入成功,这种模式一般不会产生数据丢失,但是kafka的吞吐量会很低;

4:spring.kafka.producer.batch-size   默认批处理大小(以字节为单位)。 小批量将使分批变得不那么普遍,并且可能会降低吞吐量(零批量将完全禁用批处理)。

5:spring.kafka.producer.buffer-memory   生产者可以用来缓冲等待发送到服务器的记录的内存总字节数。

6:spring.kafka.producer.compression-type   生产者生成的所有数据的压缩类型,默认值为"none",可以配置为"gzip",“snappy”和“lz4”。

千万不要忽略这个参数,可以大幅度提高推送效率,之前我有个车联网项目,推送协议采用json的格式。采用none的方式是每秒250条左右,后采用gzip后,每秒2000条。因为大部分json的报文在20kb左右,通过gzip后只有2kb,一下数据少了10倍。

7:spring.kafka.producer.key-deserializer   生产者所有keys的序列化类,默认是 org.apache.kafka.common.serialization.StringDeserializer

8:spring.kafka.producer.value-deserializer   生产者所有values的序列化类,默认是 org.apache.kafka.common.serialization.StringDeserializer 

9:spring.kafka.producer.retries   当数据发送失败时,可以重试发送的次数

10:spring.kafka.producer.transaction-id-prefix   不为空时,为生产者启用事务支持

11:spring.kafka.producer.properties   生产者其他属性配置,类型 java.util.Map<java.lang.String,java.lang.String>;

这里两个其他属性配置,常用的

  1.  消息体大小max.request.size

  2. 发送频率,和batch.size参数满足任一条件发送linger.ms

spring:
  kafka:
    producer:
      bootstrap-servers: 172.16.3.130:9092
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
      batch-size: 131072  #128kb
      buffer-memory: 67108864 #64M
      #max-request-size: 5242880
      #linger-ms: 5
      retries: 1
      acks: 0
      compression-type: gzip  #提升性能很重要
      properties:
        max.request.size: 5242880 #5M
        linger.ms: 5

(四)消费者监听器

1:spring.kafka.listener.type  监听类型,类型 Listener.Type,

  Type.SINGLE:一次调用一个ConsumerRecord的端点,默认

  Type.BATCH:用一批ConsumerRecords调用端点。

2:spring.kafka.listener.ack-mode   当 auto.commit.enable 设置为false时,表示kafak的offset由customer手动维护,spring-kafka提供了通过ackMode的值表示不同的手动提交方式;

  AckMode.RECORD   当每一条记录被消费者监听器(ListenerConsumer)处理之后提交

  AckMode.BATCH   当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后提交 

  AckMode.TIME   当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,距离上次提交时间大于TIME时提交

  AckMode.COUNT  当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,被处理record数量大于等于COUNT时提交

  AckMode.COUNT_TIME   上述 TIM 或 COUNT 有一个条件满足时提交

  AckMode.MANUAL    当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后, 手动调用Acknowledgment.acknowledge()后提交

  AckMode.MANUAL_IMMEDIATE    手动调用Acknowledgment.acknowledge()后立即提交 

3:spring.kafka.listener.client-id    监听器的使用者的client.id属性的前缀

4:spring.kafka.listener.concurrency   在监听器容器中运行的线程数,表示启动多少个并发的消费者,这个值不能大于实际消费的主题的分区数

5:spring.kafka.listener.poll-timeout   消费者一次poll方法的超时时间,当在一次poll方法中,如果一次请求不到数据或者请求的数据小于设定的值,那么poll方法会继续执行请求,直到超时或者满足设置的条件

6:spring.kafka.listener.no-poll-threshold  

7:spring.kafka.listener.ack-count   当 spring.kafka.listener.ack-mode 设置为 AckMode.COUNT 或者 AckMode.COUNT_TIME 时生效,表示当一个poll数据消费后,处理的记录数大于多少时,触发提交

8:spring.kafka.listener.ack-time   当 spring.kafka.listener.ack-mode 设置为 AckMode.TIME  或者 AckMode.COUNT_TIME 时生效,表示当一个poll数据消费后,距离上次提交时间大于 ack-time 时提交

9:spring.kafka.listener.idle-event-interval   发布空闲的消费者事件之间的时间(未接收到数据)

10:spring.kafka.listener.monitor-interval   无反应的消费者检查之间的时间。 如果未指定持续时间后缀,则将使用秒

参考:

kafka原理五之springboot 集成批量消费_kafka批量消费-优快云博客

<think>嗯,用户需要关于SpringBoot集成Kafka配置示例和教程。从之前对话历史看,用户强调过内容结构化、中文输出和添加相关问题,上次展示的快速排序案例就是典型的技术文档模板。用户可能是位Java开发工程师,正在搭建消息队列系统,语气急切但目标明确——需要可立即使用配置方案。ta可能已经读过官方文档但觉得不够直观,需要更落地的示例。深层需求或许还包括生产环境的最佳实践,比如并发和幂等性问题。让我拆解需求:1)配置格式(properties/yaml)2)完整参数示例3)与教程的衔接逻辑。需要注意上次系统指令要求的引用规范,但用户这次没提具体引用来源,我会默认标注Spring官方文档。技术要点要覆盖:1)基础连接配置2)生产者/消费者独立配置项3)容易被忽略的参数如max.poll.records。生产级配置要强调transaction-id和acks设置,这两个在电商场景特别重要。突然想到用户可能混淆了配置方式——properties和JavaConfig混用时容易冲突,需要明确区分推荐用法。示例代码里给两种配置文件的等效写法最稳妥。事务配置那部分要加警告,避免用户直接复制到非事务环境引发异常。最后生成的问题要延续技术深度:1)动态配置更新方案(比如RefreshScope)2)监控集成3)与SpringCloudStream的对比决策。用户上次对"应用场景"类问题反馈积极,这次保留类似设计。</think> 好的,这里为您提供在Spring Boot项目中集成Apache Kafka的详细配置示例和指南,使用常见的`application.yml`或`application.properties`格式。 **核心步骤和配置详解** 1. **添加依赖** 首先需要在项目的`pom.xml`(Maven)或`build.gradle`(Gradle)中添加Spring for Apache Kafka的Starter依赖。 ```xml <!-- Maven --> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` ```gradle // Gradle implementation 'org.springframework.kafka:spring-kafka' ``` 2. **配置连接信息 (application.yml 格式推荐)** 在`src/main/resources/application.yml`文件中配置Kafka集群地址和必要的通用属性。 ```yaml spring: kafka: # Kafka 集群地址 (bootstrap servers) bootstrap-servers: localhost:9092 # 生产者相关配置 (如果需要发送消息) producer: # 设置事务ID前缀 (启用事务时必需) #transaction-id-prefix: my-tx- # 消息确认模式: all(leader和所有副本都确认), 1(leader确认), 0(不等待确认) acks: all # 序列化器 (键和值的类型) key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.StringSerializer # 可选: 重试次数 (0表示不重试) retries: 3 # 消费者相关配置 (如果需要消费消息) consumer: # 消费者组ID (同一个组内消费者负载均衡消费同一个topic) group-id: my-consumer-group # 自动提交偏移量 (默认true, 生产环境建议false手动管理) enable-auto-commit: false # 自动提交间隔 (如果开启自动提交) auto-commit-interval: 1000 # 当没有初始偏移量或偏移量无效时从哪里开始消费: # earliest: 从最早的消息开始 # latest: 从最新的消息开始 (默认) # none: 如果没有偏移量则抛出异常 auto-offset-reset: earliest # 序列化器 (键和值的类型, 必须与生产者对应或能处理) key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer # 可选: 一次poll调用最多返回的记录数 max-poll-records: 500 # 可选: 最大poll间隔 (防止消费者被认为宕机) max-poll-interval-ms: 300000 # 5分钟 ``` *(等效的 application.properties 格式)* ```properties spring.kafka.bootstrap-servers=localhost:9092 # Producer spring.kafka.producer.acks=all spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.retries=3 # Consumer spring.kafka.consumer.group-id=my-consumer-group spring.kafka.consumer.enable-auto-commit=false spring.kafka.consumer.auto-offset-reset=earliest spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.consumer.max-poll-records=500 ``` 3. **编写生产者 (发送消息)** ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; @Service public class KafkaProducerService { // 注入Spring Boot自动配置好的KafkaTemplate @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { // 发送消息到指定topic kafkaTemplate.send(topic, message); // 简单发送 // kafkaTemplate.send(topic, key, message); // 指定Key发送 } } ``` 4. **编写消费者 (接收消息)** ```java import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; @Service public class KafkaConsumerService { // 使用@KafkaListener注解声明监听一个或多个Topic @KafkaListener(topics = "my-topic", groupId = "my-consumer-group") // groupId可在注解覆盖全局配置 public void consumeMessage(String message) { // 在此处理接收到的消息 System.out.println("Received Message: " + message); } // 可以监听多个Topic // @KafkaListener(topics = {"topic1", "topic2"}, ...) } ``` **关键配置项说明** * `bootstrap-servers`: Kafka集群入口地址,逗号分隔。 * `producer.key-serializer`, `producer.value-serializer`: 生产者发送消息时键和值的序列化器。常用`StringSerializer`, `ByteArraySerializer`, `JsonSerializer`。 * `producer.acks`: 消息持久化确认级别,影响消息可靠性和吞吐量。`all`最高最可靠但吞吐最低。 * `consumer.group-id`: 消费者所属组,同一个组的消费者协作消费Topic分区。 * `consumer.enable-auto-commit`: 是否自动提交偏移量(Offset)。**强烈建议设为`false`并在代码中手动管理偏移量**(例如使用`AckMode.MANUAL_IMMEDIATE`),避免重复消费或丢失消息[^1]。 * `consumer.auto-offset-reset`: 当没有初始偏移量(如新Group)或已提交偏移量无效时,从哪里开始消费。 * `consumer.key-deserializer`, `consumer.value-deserializer`: 消费者接收消息时键和值的反序列化器,必须与生产者序列化器匹配。 * `consumer.max-poll-records`: 一次poll操作返回的最大记录数,影响处理批量和延迟。 * `consumer.max-poll-interval-ms`: 两次poll操作的最大间隔时间,超过此时间消费者将被认为宕机,触发再平衡(Re-balance)。 * `producer.transaction-id-prefix`: 启用Kafka事务时必设的唯一ID前缀,需配合`@Transactional`注解使用以实现端到端精确一次语义(EOS)[^2]。 **进阶配置与最佳实践** * **`@KafkaListener`进阶**:可配置分区(如`@TopicPartition`)、Offset起始位置、并发消费者线程数(`concurrency`)、错误处理(`errorHandler`)、消息头(`@Header`)等。 * **手动提交偏移量**:使用`Acknowledgment`参数手动提交(需要设置`enable-auto-commit: false`和容器工厂的`ackMode`)。提供更好的消息交付语义保障[^1]。 * **错误处理**:配置`DefaultErrorHandler`或自定义`ErrorHandler`处理消费者异常。 * **多集群配置**:定义多个`KafkaTemplate`和`ConcurrentKafkaListenerContainerFactory` Bean,分别绑定不同的`bootstrap-servers`。 * **JSON序列化**:使用`JsonSerializer`/`JsonDeserializer`并配置信任的包`(JsonDeserializer.TRUSTED_PACKAGES)`。 * **监控**:集成Micrometer暴露Kafka相关指标到监控系统(Prometheus等)。 * **安全性**:配置SASL/SCRAM、SSL/TLS连接。 [^1]: Spring官方推荐在生产环境中手动管理Offset以获得更可靠的消息处理。Spring for Apache Kafka Documentation: https://docs.spring.io/spring-kafka/docs/current/reference/html/ [^2]: 精确一次语义需要在应用层面仔细设计,配合Kafka事务和幂等生产者使用,会带来性能开销。Kafka官方文档(Transactions): https://kafka.apache.org/documentation/#transactions
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值