Kafka在SpringBoot中的实际应用(消息订阅)

  1. 引入依赖
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.5.14.RELEASE</version>
        </dependency>
  1. 消费者配置yml
spring:
  kafka:
    consumer:
      bootstrap-servers: 192.168.2.130:9092
      auto-offset-reset: earliest
      #enable-auto-commit: true
      #消费者自动提交的间隔
      #auto-commit-interval: 5S
      #通过ack-mode设置自动提交(推荐)
      enable-auto-commit: false
      # 错误处理
      key-deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
      properties:
        spring:
          json:
            trusted:
              packages: "com.example.kafak2.user"
        spring.deserializer.key.delegate.class: org.apache.kafka.common.serialization.StringDeserializer
        spring.deserializer.value.delegate.class: org.springframework.kafka.support.serializer.JsonDeserializer
    listener:
      #listener类型为单条记录single类型(默认为single单条消费模式)
      type: single
      #offset提交模式为record
      ack-mode: record

关键属性解释:
listener-type:指定消费者监听器的类型,提供参数:
  single:单线程模式,所有分配给消费者的分区都由同一个线程处理,使用于少量主题和顺序处理的场景。
  batch:多线程模式,消费者使用多个线程来批量处理消息,每个线程负责处理一批分区的消息。适用于大量主题和需要高吞吐量的场景。

spring.json.trusted.packages:配置信任的java包。设置消费者和生产者在序列化和反序列化JSON消息时,哪些包受信任,可以被使用。如果消息中的Java包不在受信任的列表中,kafka会抛出com.fasterxml.jackson.databind.exc.InvalidTypeIdException异常,防止潜在的安全风险。多个包之间用逗号分隔。

spring.deserializer.[key|value].delegate.class:配置kay/value的反序列化器的委托类。
  委托类必须实现org.apache.kafka.common.serialization.Deserializer接口,并提供反序列化的实现。因此我们可以自定义实现一个委托类,或者使用kafka提供的默认实现类。

[key|value]-deserializer:通常设置为org.springframework.kafka.support.serializer.ErrorHandlingDeserializer,用来在反序列化时处理可能出现的异常。默认情况下,ErrorHandlingDeserializer会使用org.springframework.kafka.listener.SeekToCurrentErrorHandler作为异常处理器。该异常处理会重新定位到当前的位置,并尝试重新消费下一个消息。以确保消费者不会因为单个异常而中断,增强了消费者的健壮性。

auto-offset-reset:自定义重定位偏移量。属性值:earliest:从最早的可用消息开始消费。latest:从最新的消息开始消费。none:如果不存在消费偏移,则抛出一个异常。exception:抛出一个异常。
  需要注意的是,如果kafka服务器记录有消费者消费到的offset,那么无论设置的是什么,消费者都会按照服务器上的offset继续消费数据
  如果服务器上消费者的offset记录丢失了,此时auto-offset-rest就会起作用。

enable-auto-commit:是否自动提交偏移量,消费者的偏移量并非自动更新的,只有消费者提交之后,kafka上存储的消费组的offset才会被更新。

  需要注意的是,kafka更推荐通过ack-mode进行偏移量提交。
ack-mode提供以下几种模式:
1.RECORD当每一条记录被消费者监听器处理后提交。
2.BATCH当每一批poll()的数据被消费者监听器处理后提交
3.TIME当每一批poll()的数据被消费者监听器处理后,距离上次提交时间大于ACK-TIME时提交
4.COUNT当每一批poll()的数据被消费者监听器处理之后,被处理的record数量大于等于ACK-COUNT时提交
5.COUNT_TIME TIME COUNT设置有一个条件满足时提交
6.MANUAL当每一批poll()的数据被消费者监听器处理之后,手动调用Acknowledgment.acknowledge()后提交。
7.MANUAL_IMMEDIATE⼿动调⽤Acknowledgment.acknowledge()后⽴即提交
  kafka为什么不推荐使用enable-auto-commit进行偏移量提交
  1.无法控制提交的时机,可能会导致偏移量提交不准确或丢失。
  2.无法保证消费者偏移量的完整性:当消费者在处理消息的过程中发送错误时,无法保证偏移量完整性,可能会造成消息重复消费或者丢失。
  3.没有处理消费者偏移量的反馈信息,无法获取到提交是否成功的反馈。
  kafka为什么推荐使用ack-mode进行偏移量提交
  1.确保偏移量完整性:使用ack-mode可以确保消费者提交偏移量的请求被服务器正确处理并写入到日志中。当消费者提交偏移量时,它会等待服务器的确认,确保偏移量已经被记录下来,避免偏移量的丢失或提交不准确的问题。

  2.提供更可靠的偏移量提交:使用ack-mode可以确保偏移量的提交是可靠的。消费者会等待分区的leader接收并写入偏移量,然后才会继续消费下一批消息。如果提交失败,消费者会重试,直到成功为止。减少偏移量提交失败的情况,提高可靠性

  3.支持精确的控制:使用ack-mode可以精确地控制何时提交偏移量。根据业务需要,也可以在消息处理完成后手动提交偏移量,而不是像enable-auto-commit在固定的时间间隔或再均衡发生时自动提交。

  1. 生产者配置yml
spring:
  kafka:
   producer:
      bootstrap-servers: 192.168.2.130:9092
      # acks = 0 如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
      # acks = 1 这意味着leader会将记录写入其本地日志,但无需等待所有副本服务器的完全确认即可做出回应,在这种情况下,如果leader在确认记录后立即失败,但在将数据复制到所有的副本服务器之前,则记录将会丢失。
      # acks = all 这意味着leader将等待完整的同步副本集以确认记录,这保证了只要至少一个同步副本服务器仍然存活,记录就不会丢失,这是最强有力的保证,这相当于acks = -1的设置。
      acks: -1
      #多少数据发送一次,默认16k
      batch-size: 16384
      #客户端缓冲区大小,默认32M ,满了也会触发消息发送
      buffer-memory: 33554432
      #异常自动重试次数
      retries: 3
      properties:
        spring:
          json:
            trusted:
              packages: com.example.kafak2.user
        max:
          block:
            ms: 3000
        #批量发送等待时间,防止数据一直达不到发送容量标准
        linger:
          ms: 500
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

关键属性解释:
acks:设置消息的复制策略。
  acks=0:生产者发送消息后,不需要等待Broker的响应,消息会立即返回,这种情况下消息可能会丢失。
  acks=1:生产者发送消息后需要等待Broker的确认消息,只要消息被成功写入Leader分区就会返回ack,这种情况下如果Leader分区发生故障,消息可能会丢失。
  ack=all(或ack=-1):生产者发生消息后需要等待所有的ISR(同步副本)都确认成功后才会返回ack,这种情况下可以保证消息不丢失。

batch-size:生产者端,一次批量发送的消息数量。默认16k。

buffer-memory:用于控制生产者缓冲区的总内存大小的。它指定了生产者可以使用的总内存量,用于存储待发送消息的缓冲区。默认32M ,满了也会触发消息发送。

linger.ms:生产者发送消息的延迟时间;也可以理解为批量发送消息的等待时间,防止数据一直达不到发送的容量标准。

max.block.ms:当生产者发送消息时,如果Kafka的发送缓冲区已满或者无法连接到Kafka集群。生产者将等待的最长时间。该参数的默认值为60000毫秒(即60秒)。如果在等待时间内,无法发送消息成功,将抛出TimeoutException异常。

retries:生产者在发送消息时的重试次数。当生产者发送消息到Kafka集群时,如果发送失败或者出现可恢复的错误,生产者会尝试重新发送消息。默认值为0

  1. 消费者代码
 @KafkaListener(topicPattern="java.*",groupId = "consumerGroup1")
    public void essage(ConsumerRecord consumerRecord){
        System.out.printf("consumerGroup1:分区 = %d, 偏移量 = %d, key = %s, 内容 = %s,创建消息的时间戳 =%d%n",
                consumerRecord.partition(),
                consumerRecord.offset(),
                consumerRecord.key(),
                consumerRecord.value().toString(),
                consumerRecord.timestamp()
        );
    }
  1. 生产者代码
 @Resource
    KafkaTemplate kafkaTemplate;
    public void  sendMassage(String massage){
        Message<User> message = MessageBuilder
                .withPayload(new User("测试json","23"))
                .setHeader(KafkaHeaders.TOPIC,"javaTopic")
                .build();
        kafkaTemplate.send(message);
    }
  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kafka是一个分布式流处理平台,可以用于处理大规模的实时数据流。在Spring Boot,可以使用Spring Kafka来集成Kafka。通过Spring Kafka,我们可以轻松地将Kafka集成到Spring Boot应用程序实现消息的生产和消费。在使用Spring Kafka时,需要配置Kafka的连接信息和相关的生产者和消费者配置。同时,还需要定义消息的序列化和反序列化方式,以及消息的处理逻辑。通过这些配置和定义,我们可以实现高效、可靠的消息传递和处理。 ### 回答2: Kafka是一种高性能、分布式的消息队列系统,可以用于在分布式系统间以高吞吐量、低延迟的方式进行通信。在Spring Boot,结合Kafka可以实现基于消息队列的分布式应用程序。 使用Kafka的第一步是引入Kafka客户端依赖,可以通过Maven或Gradle进行添加。在Spring Boot,可以通过spring-kafka模块进行简化的集成。 接下来需要配置Kafka相关参数,例如Kafka集群地址、消息的序列化方式等等。在Spring Boot,可以通过在application.properties或application.yml文件设置相关参数来完成配置。 配置完成后,可以使用KafkaTemplate和@KafkaListener注解来实现生产者和消费者。KafkaTemplate可以通过send()方法将消息发送到Kafka,而@KafkaListener注解可以监听指定的topic并处理接收到的消息。 使用Kafka作为消息队列还可以进行一些高级的操作,例如消费组的使用、消息的批量处理、消息的过期时间设置等等。同时,Kafka也可以和其他Spring技术集成,例如Spring Batch和Spring Integration等。 总之,在Spring Boot使用Kafka可以极大地简化消息队列相关的开发工作,并且结合Spring框架的优势,可以更加灵活地应用Kafka的各种功能。 ### 回答3: Kafka是一款分布式的消息系统,可以处理高吞吐量的数据流。在Spring Boot结合Kafka,可以构建实时和高度可伸缩的应用程序。 使用Spring Boot集成Kafka可以方便地创建Kafka消息生产者和消费者。Spring Boot提供了Spring Kafka库,可以很方便地集成Kafka,使得使用Kafka变得更加简单。 下面是使用Kafka在Spring Boot的步骤: 1.添加Spring Kafka依赖 在pom.xml文件添加以下依赖: ``` <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.6.7</version> </dependency> ``` 2.配置Kafka连接信息 在application.properties或application.yaml文件添加Kafka连接信息,如下所示: ``` spring.kafka.bootstrap-servers=localhost:9092 ``` 3.创建Kafka生产者 使用Spring Kafka库创建Kafka消息生产者,可以使用KafkaTemplate类实现,如下所示: ``` @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String message) { kafkaTemplate.send("test-topic", message); } ``` 4.创建Kafka消费者 使用Spring Kafka库创建Kafka消息消费者,可以使用@KafkaListener注解实现,如下所示: ``` @KafkaListener(topics = "test-topic") public void receiveMessage(String message) { System.out.println("Message received: " + message); } ``` 5.启动Spring Boot应用程序 使用以上代码实现Kafka生产者和消费者功能,然后启动Spring Boot应用程序,就可以运行Kafka生产者和消费者功能了。 综上所述,Spring Boot集成Kafka的过程非常简单,只需要几个步骤就可以轻松实现Kafka消息生产和消费功能,大大简化了开发者的工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值