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”音通常是由于信号的不连续性或瞬态变化造成的。这种不连续性的数学和物理原因可以从以下几个方面解释: 数学解释 信号不连续性 当音频信号发生突变时,…

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%的把数据发送给接收方,而是尽可能. 尤其是让发送方知道,接收方是否收到. 举个例子: …

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

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

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

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

MyBatis的各种查询功能

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

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

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

(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是…

一维时间序列信号的奇异小波时频分析方法(Python)

最初的时频分析技术就是短时窗傅里叶变换STFT,由于时窗变短,可供分析的信号量减少,采用经典的谱估算方法引起的误差所占比重会增加。且该短时窗一旦选定.则在整个变换过程中其时窗长度是固定的。变换后的时频分辨率也即固定&#…

第十五届蓝桥杯物联网试题(省赛)

这个省赛题不算难,中规中矩,记得看清A板B板,还有ADC的获取要配合定时器

视频修复工具助你完成高质量的视频作品!

在短视频发展兴起的时代,各种视频层出不穷的出现在了视野中,人们已经从追求数量转向追求质量。内容相同的视频,你视频画质好、质量高的更受大家欢迎,那么如何制作高质量、高清晰度的视频呢?与您分享三个视频修复工具。…

Nios II 实现流水灯实验

Nios II 实现流水灯实验 一.硬件设计1.新建Quartus项目2. 设计Nios ii 二.软件设计 前言 实验目标: 学习 Quartus 、Platform Designer、Nios-II SBT 的基本操作;初步了解 SOPC 的开发流程,基本掌握 Nios-II 软核的定制方法;掌握 …

【Go语言精进之路】构建高效Go程序:零值可用、使用复合字面值作为初值构造器

🔥 个人主页:空白诗 文章目录 引言一、深入理解并利用零值提升代码质量1.1 深入Go类型零值原理1.2 零值可用性的实践与优势1.2.1 切片(Slice)的零值与动态扩展1.2.2 Map的零值与安全访问1.2.3 函数参数与零值 二、使用复合字面值作为初值构造器2.1 结构体…

LINUX系统编程:信号(1)

目录 什么是信号? 为什要有信号呢? 进程接受信号的过程 1.信号的产生 1.1kill命令产生信号 1.2键盘产生信号 1.3系统调用接口 1.3.1killl() 1.3.2raise() 1.3.3abort() 1.4软件条件 1.5异常 1.6对各种情况产生信号的理解 1.6.1kill命令 1…

突破 LST/LRT 赛道中心化困境,Puffer Finance 何以重塑以太坊再质押未来

纵观过去的 2023 年,LST 赛道竞争进入“白热化”状态。去中心化、DeFi 增强、全链化成为市场争夺关键词,诸多 LST 赛道老牌项目纷纷陷入“中心化矛盾”,指责对方在以太坊去中心化进程中的不利作为。 在这样的竞争情形下,以太坊联…