SpringBoot2整合Kafka

  1. 引入依赖

    xml 复制代码
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>
  2. 生产端配置

    yaml 复制代码
    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
  3. 消费端配置

    yaml 复制代码
    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
  4. 接收消息

    java 复制代码
    @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());
        }
    }
  5. 发送消息

    java 复制代码
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;
    
    @Test
    public void cotextLoads() {
        kafkaTemplate.send("first", "key", "data");
    }

生产者消费者配置全量配置:

yaml 复制代码
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
相关推荐
Cachel wood9 天前
Spark教程6:Spark 底层执行原理详解
大数据·数据库·分布式·计算机网络·spark
找不到、了9 天前
kafka消费的模式及消息积压处理方案
java·kafka
超级小忍9 天前
Spring Boot 集成 Apache Kafka 实战指南
spring boot·kafka·apache
Ting-yu9 天前
零基础学习RabbitMQ(1)--概述
分布式·学习·rabbitmq
寒山李白9 天前
分布式ID生成方式及优缺点详解
数据库·分布式·分布式id生成方式
acrel158215962219 天前
光伏电站 “智慧大脑”:安科瑞 Acrel-1000DP 分布式监控系统技术解析
分布式·分布式光伏·安科瑞电气
Cachel wood10 天前
Spark教程1:Spark基础介绍
大数据·数据库·数据仓库·分布式·计算机网络·spark
沉着的码农10 天前
【分布式】Redisson滑动窗口限流器原理
java·redis·分布式·redisson
小葛呀10 天前
在大数据求职面试中如何回答分布式协调与数据挖掘问题
大数据·分布式·机器学习·面试·数据挖掘·互联网·技术栈
阳光下是个孩子10 天前
基于 Spark 实现 COS 海量数据处理
大数据·分布式·spark