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协调者机制,来维护分区和消费者数量的一个平衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音频pop音的数学与物理解释

音频数据跳变太大的时候通常会有pop音,此时频谱上看pop音位置能量较高 音频中的“pop”音通常是由于信号的不连续性或瞬态变化造成的。这种不连续性的数学和物理原因可以从以下几个方面解释: 数学解释 信号不连续性 当音频信号发生突变时,…

LangChain学习之Chains的执行过程

1. 学习背景 在LangChain for LLM应用程序开发中课程中,学习了LangChain框架扩展应用程序开发中语言模型的用例和功能的基本技能,遂做整理为后面的应用做准备。视频地址:基于LangChain的大语言模型应用开发构建和评估。 2.前期准备 本实验…

缨帽变换(TCT)增强特征(亮度、绿度、湿度)

目录 缨帽变换(TCT)简介TCT与主成分分析(PCA)区别使用函数.matrixMultiply().arrayProject()缨帽变换(TCT)简介 缨帽变换(Tasseled Cap Transformation),也称为缨帽特征空间或缨帽系数,是一种用于遥感图像分析的线性变换方法。它最初由美国农业部的研究人员E. K…

SwiftUI三处理用户输入

代码下载 在Landmark应用中,标记喜爱的地方,过滤地标列表,只显示喜欢的地标。要增加这些特性,首先要在列表上添加一个开关,用来过滤用户喜欢的地标。在地标上添加一个星标按钮,用户可以点击它来标记这个地…

jdk的组成和跨平台原理

为什么 1.笔试会用到 2. 方便理解程序的运行 java跨平台的原因: sun公司提供了各种平台可以使用的jvm,所以java将程序一次编译成字节码之后可以给各种平台运行。这也是java这么多年深受欢迎的原因

c++ lambda学习

一. 书写形式 [ capture clause ] (parameters) -> return-type { definition of method } [ 捕获 ] ( 参数列表 ) -> 返回类型 { 函数定义 } return-type返回值一般可以推导出来, 可以不用写, 所以可以简化为 [ capture clause ] (parameters) { definition of meth…

循环购模式!增加用户复购的不二之选!

大家好,我是吴军,来自一家专注于软件开发与商业模式设计的公司。我们主要业务是构建商城系统,并为各类企业提供全面的商业模式解决方案。目前,我们已经成功开发了超过200种独特的商业模式,帮助许多企业实现了他们的商业…

TCP协议的核心机制

TCP协议的核心机制 一:确认应答机制1.2:超时重传接收缓冲区 超时重传时间重置连接 一:确认应答机制 对于TCP协议来说,要解决的一个很重要的问题,就是可靠传输 可靠传输,不是指发送方能够100%的把数据发送给接收方,而是尽可能. 尤其是让发送方知道,接收方是否收到. 举个例子: …

MySQL 数据库实验

前言 数据库实验是抽的,所以仅供大家参考哦! 查看方式 上传到云盘里面了,大家可以下载( •̀ ω •́ )y https://www.alipan.com/s/WE9G9bGHdnV 提取码:7g6c

详解:重庆耶非凡的选品师项目有哪些优势?

在竞争激烈的电商市场中,重庆耶非凡科技有限公司凭借其独特的选品师项目,成功地在众多企业中脱颖而出。这一项目不仅体现了公司对市场趋势的敏锐洞察力,更彰显了其专业的选品能力和对消费者需求的深刻理解。 首先,耶非凡的选品师项…

大模型时代的具身智能系列专题(七)

北大王鹤团队 王鹤,北京大学前沿计算研究中心助理教授,本科毕业于清华大学,博士毕业于斯坦福大学,师从美国三院院士Leonidas. J Guibas教授。他创立并领导了具身感知与交互实验室(EPIC Lab),实验室立足三维视觉感知与…

MyBatis的各种查询功能

1、查询: 查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系 resultType:自动映射,用于属性名和表中字段名一致的情况 resultMap:自定义映射,用于一对多或多对一或…

mysql 索引和null值的关系

在MySQL中,索引与NULL值的处理涉及一些特殊规则和注意事项,这些规则影响着索引的使用效率和查询优化器的决策: 索引中NULL值的包容性 允许NULL值:MySQL允许在唯一索引(Unique Index)和普通索引&#xff0…

Github生成SSH密钥,使用SSH进行连接

目录 一、生成新的SSH密钥 二、添加新的SSH密钥 三、测试SSH连接 四、SSH密钥密码 五、创建新仓库并推送到github 说明 使用 SSH URL 将 git clone、git fetch、git pull 或 git push 执行到远程存储库时, 须在计算机上生成 SSH 密钥对,并将公钥添加到…

1. 数据结构

文章目录 数据结构一、线性结构和非线性结构1. 线性结构2. 非线性结构 二、数组(Array)1. 定义2. 初始化数组 2. 链表(Linked List)3. 栈(Stack)4. 队列(Queue)5. 树(Tre…

(CVPRW,2024)可学习的提示:遥感领域小样本语义分割

文章目录 相关资料摘要引言方法训练基础类别新类别推理 相关资料 论文:Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 代码:https://github.com/SteveImmanuel/OEM-Few-Shot-Learnable-Prompt 摘要 小样本分割是一项…

STP----生成树协议

目的:解决二层环路问题 跨层封装 广播风暴---广播帧在二层环路中形成逆时针和顺时针转动环路,并且无限循环,最终造成设备宕机,网络瘫痪。 MAC地址表的翻摆(漂移)---同一个数据帧,顺时针接收后记…

GUN compiler collection源代码编译过程

第一部分: 学习kernel需要了解编译的一些过程,为了详细理解GCC编译过程的原理,动手做了个sy,记录如下,有需要的童鞋可以参考。 1.环境:(均可,二次环境并非是WSL版本) r…

大模型应用框架-LangChain

LangChain的介绍和入门 💥 什么是LangChain LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是…

[LitCTF 2024 公开赛道] Crypto/PWN/Rev

DAS是打不动了,只能玩玩新生赛了。 Crypto small_e e3对密文直接开3次方 m [iroot(i,3)[0] for i in c_list] bytes(m) #bLitCTF{you_know_m_equ4l_cub3_root_0f_n}common_primes n1,n2有公共因子,用gcd求,再解RSA >>> p gc…