Kafka系列(六):Kafka之Consumer消费者

Consumer概述

消费者

consumer是读取kafka集群某些topic消息的应用程序。

消费者组

消费者用一个消费者组名来标记自己,topic的每条消息都只会被发送到每个订阅它的消费者组的一个消费者实例上。
我们知道kafka同时支持基于队列和基于发布/订阅两种消息引擎模型。事实上kafka就是通过consumer group实现对这两种模型的支持。

  • 所有consumer实例都属于相同group——实现基于队列的模型。每条消息只会被一个consumer实例处理。
  • consumer实例都属于不同的group——实现基于发布/订阅的模型。极端情况,每个consumer实例都设置完全不同的group,这样Kafka消息就会被广播到所有的consumer实例上。

位移(offset)

这里指的是consumer端的offset,与分区日志中的offset是不同的含义。每个consumer实例都会为它消费的分区维护属于自己的位置信息来记录当前消费了多少条消息。

kafka使用consumer group保存offset,那么只需要简单的保存一个长整型数据就可以了,同时kafka consumer还引入了检查点机制定期对offset进行持久化,从而简化了应答机制的实现。

位移提交

consumer客户端需要定期的向kafka集群汇报自己消费数据的进度,这一过程被称为位移提交。

新版本和旧版本的consumer提交位移的方式截然不同:旧版本consumer会定期将位移信息提交到zk下的固定节点。但是zk只是一个协调服务的组件,他并不适合作为位移信息的存储组件。所以新版本的consumer把位移提交到kafka的一个内部topic(__consumer_offsets)上。

消费者重组

Rebalance只对consumer group有效。什么是Rebalance?它本质上是一种协议,规定了一个consumer group下所有consumer如何达成一致来分配topic的所有分区。举个例子,假设我们有一个consumer group,它有20个consumer实例。该group订阅了一个具有100个分区的topic。那么正常情况下,consumer group平均会为每个consumer分配5个分区,即每个consumer负责读取5个分区的数据。这个分配过程就被称作Rebalance。

SpringBoot集成Kafka

以下是springboot集成kafka相关的代码以及配置,我们这边springboot选用的版本是2.3.5.RELEASE,对应的org.springframework.kafka版本是2.5.7。
我这边是直接在项目中用的,所以我这边的代码只是与kafka相关的,不是很完整。

导入依赖

导入kafka依赖

  <!-- 引入kafka依赖 -->
  <dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
  </dependency>      

参数自定义配置

在配置文件中配置我们需要用到的参数,我们这边用的是yaml文件格式。


spring:
  kafka:
    bootstrap-servers: localhost:9092,localhost:9093,localhost:9094
    consumer:
      # 用于表示该consumer想要加入到哪个group中。默认值是 “”。
      group-id: training-platform-consumer
      # 当consumer向一个broker发起fetch请求时,broker返回的records的大小最小值。如果broker中数据量不够的话会wait,直到数据大小满足这个条件。
      fetch-min-size: 1
      # Fetch请求发给broker后,在broker中可能会被阻塞的(当topic中records的总size小于fetch.min.bytes时),此时这个fetch请求耗时就会比较长。这个配置就是来配置consumer最多等待response多久。
      fetch-max-wait: 500
      # 心跳间隔。心跳是在consumer与coordinator之间进行的。心跳是确定consumer存活,加入或者退出group的有效手段。这个值必须设置的小于session.timeout.ms,因为:
      # 当Consumer由于某种原因不能发Heartbeat到coordinator时,并且时间超过session.timeout.ms时,就会认为该consumer已退出,它所订阅的partition会分配到同一group 内的其它的consumer上。
      heartbeat-interval: 3000
      # Consumer 在commit offset时有两种模式:自动提交,手动提交。手动提交:通过调用commitSync、commitAsync方法的方式完成offset的提交。
      # 自动提交:是Kafka Consumer会在后台周期性的去commit。
      enable-auto-commit: false
      # 这个配置项,是告诉Kafka Broker在发现kafka在没有初始offset,或者当前的offset是一个不存在的值(如果一个record被删除,就肯定不存在了)时,该如何处理。它有4种处理方式:
      #1) earliest:自动重置到最早的offset。
      #2) latest:看上去重置到最晚的offset。
      #3) none:如果边更早的offset也没有的话,就抛出异常给consumer,告诉consumer在整个consumer group中都没有发现有这样的offset。
      # 如果不是上述3种,只抛出异常给consumer。
      auto-offset-reset: latest
      # Consumer每次调用poll()时取到的records的最大数。
      max-poll-records: 50
      # Consumer进程的标识。如果设置一个人为可读的值,跟踪问题会比较方便。
      client-id: training-platform-consumer

使用@ConfigurationProperties注解,将参数注入到对象

/**
 * @author : light
 * @date: 2020/11/10 14:32
 */
@Data
@Configuration
@ConfigurationProperties(
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值