-
引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency>
-
生产端配置
spring: kafka: bootstrap-servers: xx.xx.xx.xx:9092 producer: batch-size: 16384 #批次大小,默认16k acks: -1 #ACK应答级别,指定分区中必须要有多少个副本收到消息之后才会认为消息成功写入,默认为1只要分区的leader副本成功写入消息;0表示不需要等待任何服务端响应;-1或all需要等待ISR中所有副本都成功写入消息 retries: 3 #重试次数 value-serializer: org.apache.kafka.common.serialization.StringSerializer #序列化 key-serializer: org.apache.kafka.common.serialization.StringSerializer buffer-memory: 33554432 #缓冲区大小,默认32M client-id: kafka.producer.client.id #客户端ID compression-type: none #消息压缩方式,默认为none,另外有gzip、snappy、lz4 properties: retry.backoff.ms: 100 #重试时间间隔,默认100 linger.ms: 0 #默认为0,表示批量发送消息之前等待更多消息加入batch的时间 max.request.size: 1048576 #默认1MB,表示发送消息最大值 connections.max.idle.ms: 540000 #默认9分钟,表示多久后关闭限制的连接 receive.buffer.bytes: 32768 #默认32KB,表示socket接收消息缓冲区的大小,为-1时使用操作系统默认值 send.buffer.bytes: 131072 #默认128KB,表示socket发送消息缓冲区大小,为-1时使用操作系统默认值 request.timeout.ms: 30000 #默认30000ms,表示等待请求响应的最长时间 topic-name: kafka-topic
-
消费端配置
spring: kafka: bootstrap-servers: xx.xx.xx.xx:9092 consumer: auto-commit-interval: 5000 #自动提交消费位移时间隔时间 value-deserializer: org.apache.kafka.common.serialization.StringDeserializer key-deserializer: org.apache.kafka.common.serialization.StringDeserializer max-poll-records: 500 #批量消费每次最多消费多少条消息 enable-auto-commit: true #开启自动提交消费位移 auto-offset-reset: latest #其他earliest、none group-id: kafka.consumer.group #消费者组名称 client-id: kafka.consumer.client.id #消费者客户端ID fetch-max-wait: 400 #最大等待时间 fetch-min-size: 1 #最小消费字节数 heartbeat-interval: 3000 #分组管理时心跳到消费者协调器之间的预计时间 isolation-level: read_committed topic-name: kafka-topic
-
接收消息
@KafkaListener(topics = "first") public void onMessage(ConsumerRecords<?, ?> records) { System.out.println("消费数量=" + records.count()); for (ConsumerRecord<?, ?> record : records) { //消费的哪个topic、partition(哪个分区)的消息,打印出消息内容 System.out.println("消费:" + record.topic() + "-" + record.partition() + "-" + record.key() + "-" + record.value()); } }
-
发送消息
@Autowired private KafkaTemplate<String, String> kafkaTemplate; @Test public void cotextLoads() { kafkaTemplate.send("first", "key", "data"); }
生产者消费者配置全量配置:
spring:
kafka:
# 指定kafka 代理地址,多个地址用英文逗号隔开
bootstrap-servers: localhost:9092
#初始化生产者配置
producer:
#消息重发次数,如果配置了事务,则不能为0,改为1
retries: 0
# 每次批量发送消息的数量
batch-size: 16384
#生产者最大可发送的消息大小,内有多个batch,一旦满了,只有发送到kafka后才能空出位置,否则阻塞接收新消息
buffer-memory: 33554432
# 指定消息key和消息体的编解码方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
#确认等级ack,kafka生产端最重要的选项,如果配置了事务,那必须是-1或者all
#acks=0,生产者在成功写入消息之前不会等待任何来自服务器的响应
#acks=1,只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应
#acks=-1,表示分区leader必须等待消息被成功写入到所有的ISR副本(同步副本)中才认为product请求成功。这种方案提供最高的消息持久性保证,但是理论上吞吐率也是最差的
acks: all
#配置事务,名字随便起
#transaction-id-prefix: hbz-transaction-
#初始化消费者配置
consumer:
# 指定默认消费者group id,消费者监听到的也是这个
group-id: test-consumer-group
#消费者在读取一个没有offset的分区或者offset无效时的策略,默认earliest是从头读,latest不是从头读
auto-offset-reset: earliest
#是否自动提交偏移量offset,默认为true,一般是false,如果为false,则auto-commit-interval属性就会无效
enable-auto-commit: true
#自动提交间隔时间,接收到消息后多久会提交offset,前提需要开启自动提交,也就是enable-auto-commit设置为true,默认单位是毫秒(ms),如果写10s,最后加载的显示值为10000ms,需要符合特定时间格式:1000ms,1S,1M,1H,1D(毫秒,秒,分,小时,天)
auto-commit-interval: 1000
# 指定消息key和消息体的编解码方式
key-serializer: org.apache.kafka.common.serialization.StringDeserializer
value-serializer: org.apache.kafka.common.serialization.StringDeserializer
#批量消费每次最多消费多少条信息
max-poll-records: 50
#监听器设置
listener:
#消费端监听的topic不存在时,项目启动会报错(关掉)
missing-topics-fatal: false
#设置消费类型 批量消费batch,单条消费single
type: batch
#指定容器的线程数,提高并发量,默认为1
#concurrency: 3
#手动提交偏移量,当enable-auto-commit为true自动提交时,不需要设置改属性
#ack-mode: manual