0


Kafka之Consumer原理

1. Kafka消息消费流程

kafka的消费流程,首先是producer生产消息经过处理后放入到Broker服务器中,然后进入到内存中,内存再进行刷盘到磁盘中,kafak提供了两种刷盘策略,同步刷盘(flush.message 一次IO刷盘多少消息)和异步刷盘(flush.ms多长时间刷盘一次)

随后,消费者首先建立连接到网卡,到Broker服务器中获取消息,Broker调用sendFile函数进行零拷贝,将磁盘中的数据首先由DMA拷贝到内核态,进而零拷贝到网卡中,最后消费端还要维护一个Offset记录一下消息消费的位置,更新消费进度。

2. Offset的维护

Offset由上面我们了解到主要就是消费端消费消息的一个标记值,那么究竟是怎么存储的呢?值又是怎么更新的呢?

2.1 存储Offset信息

Offset是用于记录消费组中消费者的位置

__consumer_offsets(Topic)存储结构

__consumer_offsets中主要存储两种对象: groupMetadata(消费者信息、消费者编号 从这里知道消费者是消费哪个组的)、OffsetAndMetadata(分区以及offset)

2.2 找不到Offset

比如我们新加了一个消费者,这个消费者跟之前的Broker都没有建立连接,那么我们Broker中的Topic的Partion没有Offset记录怎么办?消费者从哪里开始消费?

在消费者中的API提供了一个参数的几种配置

auto.offset.reset=latest (默认值)消费最新的,不去消费历史记录

auto.offset.reset=earliest 消费最早的,可消费历史信息

auto.offset.reset=none 消费者组在服务端找不到offset,则报错

2.3 更新Offset值

消费者的Offset是储存在Broker中的,由消费者上报给Broker

提交Offset的方式分为两种方式

  • enable.auto.commit=true 自动提交- auto.commit.interval.ms=5000 (默认值5秒钟)自动提交的频率
  • enable.auto.commit=false 手动提交 consumer.commitSync() 手动同步提交consumer.commitAsync() 手动异步提交

Offset若不提交或提交失败,Broker的Offset就不会更新,消息会被重复消费

3. 消费者消费策略

我们从博客MQ之初识kafka-CSDN博客中已经了解到了有一个消费者组的概念,kafka中使用消费者组,主要是为了提升消费效率和吞吐量。同一个Group中的消费者,不能消费想通过的Partition

从上图中,我们可以看出,消费者组中的消费者数量是不一定的,在topic中分区partition的数量也是不确定的,那么究竟采取怎样的策略去进行消费的呢?

3.1 范围策略

范围策略就是按范围连续分配,如下图所示,假如我们的消费者组订阅的主题中有5个分区,但是消费者只有两个,那么就会对消费者进行一个简单的排序,在前面的就多消费一个

3.2 轮询策略

轮询策略就是消费者排好序后你一个我一个

4. ReBalance分区再平衡机制

分区再平衡本质上是一种协议,用来管理Consumer与Partition的匹配关系

那么何时会发生Rebalance呢?

  • 消费者组的消费者数量发生变化
  • Topic的分区数发生变更

那么ReBlance是谁来执行的呢?执行流程又是怎么样的呢? kafka中提供了一个协调者Coordinator机制进行协调,具体执行流程如下:

  • Broker集群中的各个服务器会先初始化一个GroupCoordinator服务
  • Consumer Group中的每个消费者也会初始化一个consumerCoordinator属性
  • 在集群中找到一个话事人,具体计算公式是 **partitionId=Math.abs(groupId.hashCode() % offsetsTopicPartitionCount) **计算出分区后,然后这个分区对应的leader所在的broker就是话事人
  • 之后消费者开始到话事人处进行签到,让话事人知道有几个消费者
  • 这个协调者会在消费者中选一个组长出来
  • 这个组长上报一个partition的分配方案
  • 由协调者最后通知各个消费者的这个分区方案

整体流程图如下:

5. 总结

    本文主要讲了消费者消费消息的流程,使用offset保证消息消费的正确性,以及offset的存储,offset如果找不到的话的策略配置,还有offset的更新。随后又介绍了消费者组中的消费者和主题中的分区之间的消费策略,最后当消费者数量发生变化,或者分区增加的情况下,kafka采用分区再平衡机制进行维护,利用Coordinator协调者机制,来维护分区和消费者数量的一个平衡。
标签: kafka 分布式

本文转载自: https://blog.csdn.net/still_five_Days/article/details/139425285
版权归原作者 five days 所有, 如有侵权,请联系我们删除。

“Kafka之Consumer原理”的评论:

还没有评论