kafka消费者

kafka消费方式

consumer采用pull(拉)模式从broker中读取数据

push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的,它的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞,而pull模式则可以根据consumer的消费能力以适当的速率消费消息

pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直返回空数据针对这一点,Kafka的消费者在消费数据时会传入一个时长参数timeout,如果当前没有数据可供消费,consumer会等待一段时间之后再返回,这段时长即为timeout

kafka 消费者工作流程

先了解一下offset

由于consumer在消费过程中可能会出现断电宕机等故障,consumer恢复后,需要从故障前的位置的继续消费,所以consumer需要实时记录自己消费到了哪个offset,以便故障恢复后继续消费

Kafka 0.9版本之前,consumer默认将offset保存在Zookeeper中,从0.9版本开始,consumer默认将offset保存在Kafka一个内置的topic中,该topic为__consumer_offsets

__consumer_offsets主题里面采用key和value的方式存储数据。key是group.id+topic+分区号,value就是当前offset的值。每隔一段时间,kafka内部会对这个topic进行compact

kafka 消费者工作流程

在这里插入图片描述

kafka 消费者组原理

在这里插入图片描述
在这里插入图片描述

kafka 消费者组初始化流程

  1. coordinator(消费者组协调器):辅助实现消费者组的初始化和分区的分配

  2. coordinator节点选择= groupid的hashcode值% 50 (50为系统偏移量主题__consumer_offsets的分区数量)。例如:groupid的hashcode值=1,1%50=1,那么_consumer_offsets 主题的1号分区在哪个broker上,就选择这个节点的coordinator作为这个消费者组的老大,消费者组下的所有的消费者提交offset的时候就往这个分区去提交offset

在这里插入图片描述

kafka 消费者组初始化完毕后,开始工作,具体工作流程如下

在这里插入图片描述

kafka 分区的分配以及再平衡

  1. 一个consumer group中有多个consumer组成,一个topic有多个parttion组成,现在的问题是,到底由哪个consumer来消费哪个partition的数据

  2. Kafka有四种主流的分区分配策略: Range、RoundRobin、Sticky、CooperativeSticky

可以通过配置参数partition.assignment.strategy,修改分区的分配策路。默认策路是Range + CooperativeSticky。Kafka可以同时使用多个分区分配策略

Range

在这里插入图片描述

RoundRobin

在这里插入图片描述

Sticky

粘性分区是Kafka从0.11.x版本开始引入这种分配策略,首先会尽量均衡的放置分区到消费者上面,在出现同一消费者组内消费者出现问题的时候,会尽量保持原有分配的分区不变化

在这里插入图片描述

企业中怎么选择分区的分配策略

企业中一般会 粘性+Range 或者 粘性+RoundRobin 组合使用

那粘性什么时候起作用

粘性一般在分区再平衡中起作用

kafka 分区再平衡

再平衡是怎么回事

当消费者组中的消费者挂掉后,它原来消费的N个分区,怎么再次进行分配

引起再平衡的条件

  1. 每个消费者都会和消费者组协调器(coordinator)保持心跳(默认3s) ,—旦超过45s(session.timeout.ms=45s),该消费者就会被剔除,然后触发再平衡
  2. 消费者处理消息的时间超过5分钟(max.poll.interval.ms=5分钟),然后触发再平衡

kafka 事务

重复消费:已经消费了数据,但是offset没提交

在这里插入图片描述

漏消费:先提交offset后消费,有可能会造成数据的漏消费

在这里插入图片描述

思考:怎么能做到既不漏消费也不重复消费呢?

如果想完成Consumer端的精准一次性消费,那么需要Kafka消费端将消费过程和提交offset过程做原子绑定,即需要将Kafka的offset保存到支持事务的自定义介质中去(比如MySQL)

kafka 消费者如何提高吞吐量

  1. 如果是Kafka消费能力不足,则可以考虑增加Topic的分区数,并且同时提升消费组的消费者数量,消费者数=分区数(两者缺一不可)

在这里插入图片描述

  1. 如果是下游的数据处理不及时,那就去提高每批次拉取的数量。批次拉取数据过少,使处理的数据小于生产的数据,也会造成数据积压

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值