kafka多个消费者消费一个topic_kafka:一文读懂消费者背后的那点quot;猫腻quot;

e6bb83bdb856dfb15c7343a6508bfe39.png

来自:z小赵

前言

经过前几篇文章的介绍,大致了解了生产者背后的运行原理。消息有生产就得有人去消费,今天我们就来介绍下消费端消费消息背后发生的那点事儿。

文章概览

  1. 消费者与消费组的“父子关系”。
  2. Repartition 触发时机。
  3. 消费者与 ZK 的关系。
  4. 消费端工作流程。
  5. 消费者的三种消费情况。

消费者与消费组的“父子关系”

eb15abb7d30db788c762149ea0be7b2c.png
消费者消费组关系图

Kafka 消费端确保一个 Partition 在一个消费者组内只能被一个消费者消费。这句话改怎么理解呢?

  1. 在同一个消费者组内,一个 Partition 只能被一个消费者消费。
  2. 在同一个消费者组内,所有消费者组合起来必定可以消费一个 Topic 下的所有 Partition。
  3. 在同一个消费组内,一个消费者可以消费多个 Partition 的信息。
  4. 在不同消费者组内,同一个分区可以被多个消费者消费。
  5. 每个消费者组一定会完整消费一个 Topic 下的所有 Partition。

消费组存在的意义

了解了消费者与消费组的关系后,有朋友会比较疑惑消费者组有啥实际存在的意义呢?或者说消费组的作用是什么?

作者对消费组的作用归结了如下两点。

  1. 在实际生产中,对于同一个 Topic,可能有 A、B、C 等 N 个消费方想要消费。比如一份用户点击日志,A 消费方想用来做一个用户近 N 天点击过哪些商品;B 消费方想用来做一个用户近 N 天点击过前 TopN 个相似的商品;C 消费方想用来做一个根据用户点击过的商品推荐相关周边的商品需求。对于多应用场景,就可以使用消费组来隔离不同的业务使用场景,从而达到一个 Topic 可以被多个消费组重复消费的目的。
  2. 消费组与 Partition 的消费进度绑定。当有新的消费者加入或者有消费者从消费组退出时,会触发消费组的 Repartition 操作(后面会详细介绍 Repartition);在 Repartition 前,Partition1 被消费组的消费者 A 进行消费,Repartition 后,Partition1 消费组的消费者 B 进行消费,为了避免消息被重复消费,需要从消费组记录的 Partition 消费进度读取当前消费到的位置(即 OffSet 位置),然后在继续消费,从而达到消费者的平滑迁移,同时也提高了系统的可用性。

Repartition 触发时机

使用过 Kafka 消费者客户端的同学肯定知道,消费者组内偶尔会触发 Repartition 操作,所谓 Repartition 即 Partition 在某些情况下重新被分配给参与消费的消费者。基本可以分为如下几种情况。

  1. 消费组内某消费者宕机,触发 Repartition 操作,如下图所示。
7e276f83216b8f5ff824ba4dbdedbb4b.png
消费者宕机情况
  1. 消费组内新增消费者,触发 Repartition 操作,如下图所示。一般这种情况是为了提高消费端的消费能力,从而加快消费进度。
f098b5a7f4c191c195d3c6742628d8a7.png
新增消费者情况
  1. Topic 下的 Partition 增多,触发 Repartition 操作,如下图所示。一般这种调整 Partition 个数的情况也是为了提高消费端消费速度的,因为当消费者个数大于等于 Partition 个数时,在增加消费者个数是没有用的(原因是:在一个消费组内,消费者:Partition = 1:N,当 N 小于 1 时,相当于消费者过剩了),所以一方面增加 Partition 个数同时增加消费者个数可以提高消费端的消费速度。
0cbe0dfe599a2eaa75806d9fc4633839.png
新增Partition个数情况

消费者与 ZK 的关系

众所周知,ZK 不仅保存了消费者消费 partition 的进度,同时也保存了消费组的成员列表、partition 的所有者。消费者想要消费 Partition,需要从 ZK 中获取该消费者对应的分区信息及当前分区对应的消费进度,即 OffSert 信息。那么 Partition 应该由那个消费者进行消费,决定因素有哪些呢?从之前的图中不难得出,两个重要因素分别是:消费组中存活的消费者列表和 Topic 对应的 Partition 列表。通过这两个因素结合 Partition 分配算法,即可得出消费者与 Partition 的对应关系,然后将信息存储到 ZK 中。Kafka 有高级 API 和低级 API,如果不需要操作 OffSet 偏移量的提交,可通过高级 API 直接使用,从而降低使用者的难度。对于一些比较特殊的使用场景,比如想要消费特定 Partition 的信息,Kafka 也提供了低级 API 可进行手动操作。

消费端工作流程

在介绍消费端工作流程前,先来熟悉一下用到的一些组件。

  • KakfaConsumer:消费端,用于启动消费者进程来消费消息。
  • ConsumerConfig:消费端配置管理,用于给消费端配置相关参数,比如指定 Kafka 集群,设置自动提交和自动提交时间间隔等等参数,都由其来管理。
  • ConsumerConnector:消费者连接器,通过消费者连接器可以获得 Kafka 消息流,然后通过消息流就能获得消息从而使得客户端开始消费消息。

以上三者之间的关系可以概括为:消费端使用消费者配置管理创建出了消费者连接器,通过消费者连接器创建队列(这个队列的作用也是为了缓存数据),其中队列中的消息由专门的拉取线程从服务端拉取然后写入,最后由消费者客户端轮询队列中的消息进行消费。具体操作流程如下图所示。

f2bd398d592f61897843b5aecc5311cb.png
消费端工作流程

我们在从消费者与 ZK 的角度来看看其工作流程是什么样的?

35323cb72a2f13e85527a18ff7d4602f.png
消费端与ZK之间的工作流程

从上图可以看出,首先拉取线程每拉取一次消息,同步更新一次拉取状态,其作用是为了下一次拉取消息时能够拉取到最新产生的消息;拉取线程将拉取到的消息写入到队列中等待消费消费线程去真正读取处理。消费线程以轮询的方式持续读取队列中的消息,只要发现队列中有消息就开始消费,消费完消息后更新消费进度,此处需要注意的是,消费线程不是每次都和 ZK 同步消费进度,而是将消费进度暂时写入本地。这样做的目的是为了减少消费者与 ZK 的频繁同步消息,从而降低 ZK 的压力。

消费者的三种消费情况

消费者从服务端的 Partition 上拉取到消息,消费消息有三种情况,分别如下:

  1. 至少一次。即一条消息至少被消费一次,消息不可能丢失,但是可能会被重复消费。
  2. 至多一次。即一条消息最多可以被消费一次,消息不可能被重复消费,但是消息有可能丢失。
  3. 正好一次。即一条消息正好被消费一次,消息不可能丢失也不可能被重复消费。

1.至少一次

消费者读取消息,先处理消息,在保存消费进度。消费者拉取到消息,先消费消息,然后在保存偏移量,当消费者消费消息后还没来得及保存偏移量,则会造成消息被重复消费。如下图所示:

8a6bae60cbf43f71e66d2e7c3cc1cd8b.png
先消费后保存消费进度

2.至多一次

消费者读取消息,先保存消费进度,在处理消息。消费者拉取到消息,先保存了偏移量,当保存了偏移量后还没消费完消息,消费者挂了,则会造成未消费的消息丢失。如下图所示:

17f811c8bd5c75940ad7cfeaf377bcbd.png
先保存消费进度后消费消息

3.正好一次

正好消费一次的办法可以通过将消费者的消费进度和消息处理结果保存在一起。只要能保证两个操作是一个原子操作,就能达到正好消费一次的目的。通常可以将两个操作保存在一起,比如 HDFS 中。正好消费一次流程如下图所示。

a270507d7311a0a2649b45babcef3d78.png
正好消费一次

总结

本文讲解了消费组与消费者之间的关系,及 Repartition 的触发时机,然后讲述了消费端的基本工作流程,最后提出了一条消息被重复消费的几种情况。下篇文章我们来讲讲消息在服务端是怎么存储的,敬请期待。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

0cd743d81199a657f8f092dc80a2ba8a.png

长按订阅更多精彩▼

9ff77bba8b8910ebadbe9ecc17635129.png

如有收获,点个在看,诚挚感谢

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

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

相关文章

MySQL 入门教程:初学者一学就会,零基础 MySQL 安装及增删改查入门

文章目录前言一、MySQL 的相关概念介绍二、Windows 下 MySQL 的配置2.1、MySQL 安装配置步骤2.2、MySQL 服务的启动、停止与卸载三、MySQL 脚本的基本组成四、MySQL 中的数据类型4.1、数字类型4.2、日期和时间4.3、字符串类型五、使用 MySQL 数据库5.1、登录到 MySQL5.2、创建一…

四大基本反应类型的关系_如何进入四大的咨询部门?

在会计行业,人人梦寐以求的职位,莫过于四大的财务咨询的岗位,第一咨询工作很高大上,第二没有其他职位那么幸苦,我从我的工作经历来讲讲,我是怎么进入咨询这个“真香”岗位的。首先,给大家说一个…

MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结

Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! 几种解决方式小结 文章目录Could not open JDBC Connection for transaction; nested exception is java.sql…

vnc用户名 查看linux_vnc用户名未被识别,5步教你如何解决vnc用户名未被识别

在进行vnc使用时,很多小伙伴会出现用户名未被识别的情况,那如何解决vnc用户名未被识别呢?咱接着往下看。使用工具:IIS7服务器管理工具主程序界面图:官网地址:IIS7服务器管理工具作为IIS7服务器管理工具&…

IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题

文章目录前言一、修改当前 Web 项目 Tomcat Server 的虚拟机输出选项二、修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码三、IntelliJ IDEA 中自定义虚拟机选项四、直接修改 IntelliJ IDEA 配置文件的编码信息五、修改成功乱码问题解决总结前言 IntelliJ IDEA 如果不进行…

JVM 调优 1:“精通 JVM 调优,有过 JVM 调优经验”简历敢写吗?薪资涨 5k 的技巧

文章目录前言一、部分大厂对于 JVM GC 的面试题1.1、百度1.2、顺丰1.3、京东1.4、淘宝1.5、阿里、蘑菇街二、Garbage Collectors(GC)作何使用三、GC 的十种类型四、JVM 的版本参数信息4.1、查看 Java 启动时所有默认的命令行参数4.2、查看 Java 启动时 G…

ip地址合不合法怎么看_电子印章合不合法?两部门再发意见认定

近日,最高法、国家发改委联合发布 《关于为新时代加快完善社会主义市场经济体制提供司法服务和保障的意见》以助力经济高质量发展、建设高标准市场体系为出发点和落脚点,从市场主体、产权保护、公平交易、市场秩序、民生保障、服务开放、高效解纷等七个方…

JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?

文章目录前言一、如何判断一个对象是否为垃圾?1.1、reference count(引用计数)1.2、reference count(引用计数)存在的问题二、Root Searching(根可达算法或根搜索算法)2.1、Root Searching 释义…

班尼机器人怎么拆_博鼎建筑科技外墙错台打磨机器人和外墙螺杆洞封堵机器人—自升造楼平台1+N执行器...

继上期的混凝土整平机和智能喷淋养护系统,本期给大家介绍的是实际应用在自升造楼平台外墙环轨车上的外墙错台打磨机器人和外墙螺杆洞封堵机器人。外墙错台打磨机器人传统外墙错台处理,需要人工拿凿具对外墙面错台进行凿平处理。凿具重、操作人工容易疲劳…

架构师基础必备:“腹有诗书气自华”,驰骋一线大厂不是梦,抓紧收藏

文章目录前言一、软件1.1、何为软件?1.2、计算机软件的分类1.2.1、系统软件1.2.2、应用软件1.3、软件系统体系结构1.3.1、C/S 结构(桌面应用程序)1.3.2、B/S 结构(Web 应用程序)1.3.3、Web 服务器与数据库服务器1.3.4、…

JDK 7-JDK 21:Oracle Java SE 支持路线图/Oracle Java SE Support Roadmap 持续更新

文章目录前言一、Oracle Java SE 产品版本二、Java SE 8 的公共更新结束三、参考文档总结前言 几十年来,Java 生态系统已经成功地经历了这个过程,经历了十次主要的平台修订。长期强大的向后兼容性保护了整个生态系统的投资。同时,随着时间的推…

multisim中轻触开关在哪_现货供应轻触开关|品质确保|厂家直销

轻触开关是现今社会生活当中不可或缺的电子元器件之一,那么大家在使用的过程当中是否注意到一些细节问题。首先,我们要注意产品的放置要尽量避免接触腐蚀性气体以及过于潮湿的环境,这样很容易造成产品的损坏,减少轻触开关的使用寿…

DDoS 攻击与防护(一):如何识别 DDoS 攻击?DDoS 防护 ADS 服务有哪些?

文章目录前言一、什么是 DDoS 防护 ADS?1.1、什么是 DDoS 攻击?1.2、如何识别 DDoS 攻击?1.3、从 Web 访问流程分析 DDoS 攻击1.4、DDoS 攻击类型二、DDoS 防护 ADS 介绍2.1、Anti-DDoS 流量清洗2.2、DDoS 原生高级防护2.3、DDoS 高防三、DDo…

收藏功能_六款多功能榻榻米,装完你家会大一半!超实用,收藏

原标题:六款多功能榻榻米,装完你家会大一半!超实用,收藏当今社会城市的生活压力大,在外日夜打拼,回到家中只想做一个慵懒派,随性舒适的榻榻米,功能样式丰富,能让你彻底释…

混凝土墙开洞_新乐专业混凝土切割报价适中

新乐专业混凝土切割报价适中粘碳纤维加固,屋顶加层。本公司采用目前的钢筋混凝土切割结构分离和水钻排孔技术。真正实现对不同规格和形状的桥梁、道路、烟囱、建筑立柱、钢筋砼墙体、砖混结构墙体、建筑大梁等建筑物、构筑物实施无损切割(传统的建筑改造或局部拆除分…

class触发后让另一个class加样式_Bootstrap的按钮组样式

将一系列的.btn包裹在.btn-group内&#xff0c;并使用我们提供的插件&#xff0c;可以实现选择按钮、选取块状区的行为功能。<div class"row mt-5 d-block"><div class"btn-group"><button class"btn btn-primary">Left</b…

bsp模型适用于图计算_【论文解读】目标检测之RFBnet模型

原创声明&#xff1a;本文为 SIGAI 原创文章&#xff0c;仅供个人学习使用&#xff0c;未经允许&#xff0c;不能用于商业目的。其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》&#xff0c;清华大学出版社&#xff0c;雷明著&#xff0c;由SI…

win10雷电3接口驱动_“雷电3”接口知识大科普

近年来部分高端笔记本电脑在接口上会采用一种叫“雷电3”的新接口。今天小编就为大家解读一下“雷电3”接口的特性。最早的雷电接口雷电接口是由Intel开发定制的、接口类型为mini DP&#xff0c;在雷电3接口出来之前&#xff0c;雷电1和雷电2都是作为在苹果MAC上使用的&#xf…

springboot怎么返回404_深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?...

简介日常开发过程中&#xff0c;难免有的程序会因为某些原因抛出异常&#xff0c;而这些异常一般都是利用try &#xff0c;catch的方式处理异常或者throw&#xff0c;throws的方式抛出异常不管。这种方法对于程序员来说处理也比较麻烦&#xff0c;对客户来说也不太友好&#xf…

新生成长记;关于zzulioj1056,幸运数字

刚刚接触代码的我&#xff0c;对计算机愈来愈好奇&#xff0c;开学的两个月&#xff0c;几乎没看书只顾着做题&#xff0c;当然&#xff0c;不会就百度&#xff0c;或者看大佬的博客&#xff0c;这些都是好东西&#xff0c;实在看不懂的&#xff0c;就拿着跑去问学长&#xff0…