【夯实Kafka知识体系及基本功】分析一下消费者(Consumer)实现原理分析「原理篇」

news2025/1/17 0:52:53

Consumer消费者

  • 消费者可以从broker中读取数据。

  • 一个消费者可以消费多个topic中的数据(其中一个partion)。

Consumer Group(消费组)

  • 每个Consumer属于一个特定的Consumer Group

  • 可为每个Consumer指定group name,若不指定group name则属于默认的group

主题分区和消费者群组

KafkaConsumer从Kafka订阅Topic,并从订阅的Topic拉取消息。

Kafka的消费者属于消费者群组,一个群组的消费者订阅多个主题,每个消费者接收主题一部分分区的消息。

每个分区只能被消费者群组的一个消费者接收消息,如果一个消费者群组的消费者数多于一个主题的分区数,则多余的消费者会空闲。

如果主题T1有4个分区,那么消费者群组1有1个、2个、4个和5个消费者的话,与分区的连接情况分别如下:

分区再均衡Rebalance

  • 分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均衡。再均衡为Kafka的消息消费带来了高可用性和伸缩性,从而让我们可以放心地添加或者移除消费者,也能很好地处理单节点故障。

  • 但是在再均衡期间,消费者无法读取消息,会造成整个群组的一小段时间不可用。另外,当分区被重新分配给另一个消费者时,消费者当前的读取状态会丢失,它可能还需要去刷新缓存,在它恢复状态之前会拖慢整个应用程序。因此,在正常情况下我们并不希望发生再均衡行为。

当一个新的消费者加入,原本从属其他消费者的分区可能分配到该消费者。

例如原本消费者群组只有一个消费者,那么分区0到分区3这4个都是从属这一个消费者的,如果第二个消费者加入,那么分区2和分区3就会分配给第二个消费者。相反地,如果发生消费者的关闭或者崩溃,也会由其他消费者来接手原本从属于这个消费者的分区。

消费者通过向被指派为群组协调器的broker发送心跳来维持它们和群组的丛书关系以及它们对分区的所有权关系。

消费者会在轮询(为了获取消息)或者提交偏移量的时候发送心跳,来证明自己是活跃的,如果消费者停止发送心跳的时间过长,那么会话就会过期,群组协调器认为它已经死亡,就会触发一次再均衡


  1. 分配分区是怎样的一个过程,当消费者要加入群组时,它会向群组协调器发送 JoinGroup 请求。

  2. 第一个加入群组的消费者将成为“群主”。

  3. 群主从协调器那里获得群组的成员列表(列表中包含了所有最近发送过心跳的消费者,它们被认为是活跃的), 并负责给每一个消费者分配分区

  4. 它使用一个实现了 PartitionAssignor 接口的类来决定哪些分区应该被分配给哪个消费者。

Kafka为什么这么快?

在消息中间件技术选型的时候有很多选择,Kafka为什么可以脱颖而出?主要是Kafka无与伦比的性能表现。

比如在某电商网站的线上活动中,Kafka 搭建的日志集群单个Topic可以达到几百万的TPS,而使用RocketMQ组件的核心业务集群,集群TPS只能达到几十万TPS

但性能也并不是考虑技术选型的唯一标准

  • 还有从功能性上来考虑,例如 RocketMQ 提供了丰富的消息检索功能、事务消息、消息消费重试、定时消息等。

  • 从业务的角度考虑,通常在大数据、流式处理场景基本选用 Kafka,业务处理相关选择 RocketMQ。


Kafka 中文件的布局是以 Topic/partition ,每一个分区一个物理文件夹,在分区文件级别实现文件顺序写,如果一个 Kafka 集群中拥有成百上千个主题,每一个主题拥有上百个分区,消息在高并发写入时,其 IO 操作就会显得零散,其操作相当于随机 IO,即 Kafka 在消息写入时的 IO 性能会随着 topic 、分区数量的增长,其写入性能会先上升,然后下降。

RocketMQ 在消息写入时追求极致的顺序写,所有的消息不分主题一律顺序写入 commitlog 文件,并不会随着 topic 和 分区数量的增加而影响其顺序性。但通过笔者的实践来看一台物理机并使用 SSD 盘,但一个文件无法充分利用磁盘 IO 的性能。

两者文件组织方式,除了在磁盘的顺序写方面有所区别后,由于其粒度的问题,Kafka 的 topic 扩容分区会涉及分区在各个 Broker 的移动,其扩容操作比较重,而 RocketMQ 数据存储是基于 commitlog 文件的,扩容时不会产生数据移动,只会对新的数据产生影响,RocketMQ 的运维成本对 Kafka 更低。

最后 Kafka 的 ack 参数可以类比 RocketMQ 的同步复制、异步复制。

  • Kafka 的 ack 参数为 1/0 时,对比 RocketMQ 的异步复制;

  • -1 对标 RocketMQ 的 同步复制,而 -1 则对标 RocketMQ 消息发送方式的 oneway 模式。

Kafka 在消息发送方面比 RocketMQ 有一个显著的优势就是消息格式的组织是发生在客户端,这样会有一个大的优势节约了 Broker 端的 CPU 压力,客户端“分布式”的承接了其优势,其架构方式有点类似 shardingjdbc 与 MyCat 的区别。

Kafka 在消息发送端另外一个特点是引入了双端缓存队列,Kafka 无处不在追求批处理,这样显著的特点是能提高消息发送的吞吐量,但与之带来的是增大消息的响应时间,并且带来了消息丢失的可能性,因为 Kafka 追加到消息缓存后会返回成功,如果消息发送方异常退出,会带来消息丢失。

Kafka 中的 linger.ms = 0 可类比 RocketMQ 消息发送的效果。

但 Kafka 通过提供 batch.size 与 linger.ms 两个参数按照场景进行定制化,比 RocketMQ 灵活。

例如日志集群,通常会调大 batch.size 与 linger.ms 参数,重复发挥消息批量发送机制,提高其吞吐量;但如果对一些响应时间比较敏感的话,可以适当减少 linger.ms 的值。

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

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

相关文章

自动驾驶--定位技术

[整理自百度技术培训中心课程](https://bit.baidu.com/products?id70) 为什么无人车需要精确的定位系统 在地下车库实现自动泊车的一个非常关键的技术是什么呢?那就是定位技术。 为什么无人车需要一个精确的定位系统。为什么无人车需要精确的定位系统&#xff…

网络线缆连接器和线槽

一、信息插座 1、信息插座简介 信息插座是终端(工作站)与水平干线子系统连接的接口,在水平干线子系统中双绞线的两 端是直接压接到配线架和信息插座中的,不需要跳线。 2、信息插座的配置 综合布线系统的设计,应该根据实际情况确定 所需信息插座个数和分布位置,也就决…

计算机的另一半

本篇先介绍了计算机中数字编码,地址的概念。然后介绍了组成计算机的另外一半内容,也就是CPU,和前面的计算机一半合起来就可以组成一个简易版的计算机了。至此终于大概看到了计算机的全貌。 数字编码系统 这里我们简单说一下计算机里数字编码…

智慧环卫解决方案-最新全套文件

智慧环卫解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧环卫全套最新解决方案合集一、建设背景 城市环境卫生管理是一项复杂而系统的社会工程,是与人民群众生活联系最密切的重要工作之一。环卫水平不仅是一个城市的“脸面”&#xff0…

kotlin 之单例类详解

object 单例对象的声明: object Model{var temp "1"val temp2 "2"const val temp3 "3" }抛出疑问:使用object修饰的类,是哪种类型的单例模式 这里我们先回顾一下java六种单例模式 1. 饿汉式 public c…

String、StringBuffer和StringBuilder类的区别

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 Java 提供了两个可变字符串类 Stri…

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

ELFK——ELK结合filebeat日志分析系统(2)_Evens7xxX的博客-CSDN博客 紧接上期,在ELFK的基础上,添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志:192.168.116.40,修改配置将采集到的…

SoC-ZCU106求解非线性方程(一):环境安装

一、大家好久不见,本次给大家带来的是SoC求解非线性方程问题。计划发布三篇文章,这是第一篇----环境安装。 主要的解决的问题是:PL侧给PS传输数据,然后PS将数据作为已知量求解非线性方程,为了简化问题复杂度&#xff…

中睿天下实力入选2022信创产业独角兽TOP100

近日,中国科学院主管的权威媒体《互联网周刊》、德本咨询、eNet研究院联合发布了“2022信创产业独角兽100强”榜单。中睿天下凭借在网络安全攻击溯源领域的深耕、硬的技术能力和突出的产品创新力,实力入选榜单,在上榜的安全企业中&#xff0c…

Docker(四)—— 部署Nginx、Tomcat

一、部署Nginx 将Nginx后台挂载后,用curl命令访问,进行本机自测: 二、部署Tomcat 出现404页面的原因:为了缩小镜像的大小,官方下载的Tomcat镜像是精简版的,只提供了必要、核心的内容。我们进入容器内部的/w…

You辉编程_kafka

一、什么是kafka? 是分布式(项目部署于多个服务器)的基于发布/订阅模式的消息队列,主要用于处理活跃的数据,如:登录、浏览、点击、分享等用户行为产生的数据,说白了就是一个消息系统(消息队列)。 进一步…

java项目-第132期ssm学生会管理系统-ssm+shiro+activity社团毕业设计

java项目-第132期ssm学生会管理系统-ssmshiroactivity社团毕业设计 【源码请到资源专栏下载】 今天分享的项目是《学生会管理系统》 该项目分为不同的角色,其中包含超级管理员、生活文体部部长、行政秘书部部长、 外联部部长、策划部部长、学生会干事等角色&#xf…

[附源码]java毕业设计基于的网上饮品店

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

FITC标记葡聚糖(40kDa),FITC Dextran-40,CAS号:60842-46-8

中文名称:FITC标记葡聚糖(40kDa) 英文名称:FITC Dextran-40 CAS号:60842-46-8 产品规格:50mg|250mg|1g 本制品是对平均分子量约40kDa葡聚糖进行标记的荧光素衍生物,即异硫氰酸荧光素葡聚糖40(fluoresce…

QT编译Opencv库过程中出现的问题总结

一、人脸识别模块编译出错 出错原因:没有加入opencv_contrib OpenCV 4.4开始需要提供opencv_contrib 如果不需要人脸识别模块可以进行下列操作 [ 77%] Linking CXX executable ..\..\bin\opencv_test_dnn.exe jom: E:\1WT\18.OCR\opencv\build-sources-Desktop_…

计算机网络 3 - 传输层

第3章 传输层(Transport Layer)3.1 传输层服务与协议3.2 复用 分用无连接的分用、复用(UDP)面向连接的分用、复用(TCP)持续/非持续HTTP连接 与 常见端口3.3 无连接传输: UDP3.4 可靠数据传输原理(rdt)rdt 1.0:经完全可靠信道的可靠数据传输rdt 2.0:发现并…

了解操作符的那些事(二)

小叮当的任意门sizeof 和 数组关系操作符逻辑操作符条件操作符逗号表达式下标引用,函数调用和结果成员下标引用函数调用访问一个结构的成员表达式求值隐式类型转换算术转换操作符的属性前言:~ 对一个数的二进制按位取反 *间接访问操作符(解引用操作符&am…

linux笔记(3):东山哪吒STU开发板(全志D-1H)开箱初体验helloworld

文章目录1.开发板上电观察串口1.1 从nand flash启动1.2 从SD卡启动2.上传文件到开发板2.1 使用FileZilla软件连接开发板2.2 使用ADB软件双11下单后,经过多日的等待,终于在昨天下午收到了开发板。在等待的过程中,看了一下文档和B站东山老师的视…

Java_封装

目录 1.访问修饰限定符 2.封装扩展之包 导入包中的类 3.自定义包 4.包的访问权限控制举例 5.常见的包 6.通过构造方法进行初始化 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来…

RPC初识

一、为什么要学习RPC 要回答这个问题,那就必须先了解下 RPC 的使用场景。 只要涉及到网络通信,我们就可能用到RPC 大型分布式系统中:消息队列、分布式缓存、分布式数据库、统一配置中心等,应用程序与这些依赖的中间件都可以通过 …