Kafka 的 Consumer Group 解读

作为一份笔记,本文再次梳理一下 Kafka 的 Consumer Group。我们知道,一个 Topic 往往会有多个 Partition,一条消息只会被写到一个 Kafka 的 Partition 中,那 Consumer 是怎么消费 Message 的呢? Consumer Group 又从中起到了什么作用呢?

Consumer Group 与 Consumer 到底有何不同?

首先,我们必须要非常清楚地明确一点:Consumer Group 才是消费一个 Topic 的“独立单位”,什么意思呢?就是说:一个 Consumer Group 才是一个通常意义上和 Consumer Client,它下面的 Consumer 实例是作为一个整体消费且只消费一遍 Topic 里的消息,而不是每一个 Consumer 独立消费一遍。当然,如果一个 Consumer Group 只有一个 Consumer,就没有区别了。

这样的话,一个 Consumer Group 下的多个 Consumer 是怎么分配消息的呢?一条消息投递到 Kafka 中究竟会被哪个 Consumer 读取?这中间的具体逻辑是什么呢?下图给出个非常清晰的解释:(摘抄自 Kafka The Definitive Guide, 2nd Edition ):

image-20240116150556174

上图中 Consumer Group 中有三个 Consumer 实例,Topic 中有四个分区,Kafka 的安排是:其中两个 Consumer 各自读取一个 Partition,剩下的一个 Consumer 读取其余两个 Partition。所以,你会看到:没有一个 Consumer 能读全所有的消息!大家更像是在分头消化各自的“责任田”。下图是以两个 Consumer Group 为例,再次描述了同样的逻辑:

kafka_consumer_group_scenario_4

下图是依然是描述了这个事实:

6d9de5f98c922ba6e9cb6a9b592cc529

根据 Consumer Group 的工作特点,我们不难看出:

  1. 一个 Partition 只会被一个 Consumer Group 中的一个 Consumer 实例消费 (不会有同 Group 的两个 Consumer 重复消费一条消息)

  2. 一个 Consumer Group 的 一个 Consumer 实例可能会消费一个 Partition,也可能会消费两个或两个以上的 Partition,还有可能一个 Partition 都不消费,这取决于 Partition 和 Consumer 的数量!以下是我们说的三种可能情形的示意图:

  • Case 1:一个 Consumer Group 只有一个 Consumer,该 Consumer 能读取到全部消息

kafka_consumer_group_scenario_1

  • Case 2:一个 Consumer Group 有多个 Consumer,Consumer 均分 Partition,每个 Consumer 都读取一部分消息

kafka_consumer_group_scenario_2

  • Case 3:一个 Consumer Group 的 Consumer 数量超过了 Partition 的数量,部分 Consumer 因未分配到 Partition,一条消息也不会读到

kafka_consumer_group_scenario_3

Kafka 为什么要设计 Consumer Group 而不是直接以 Consumer 为单位读取 Message?

Kafka 设计 Consumer Group 的意图应该不难揣测,这样做显然是让 Topic 从只能由一个 Consumer 消费变成了:可以多个 Consumer 消费并行消费且还不用担心有重复数据,这样能提升消费端的整体吞吐能力。不过,要注意的是:Kafka 只能保证单个分区内的消息是按产生的先后顺序排列的,在多分区下,无法从整体上保证消息的有序性,所以,当一个 Consumer Group 下有多个 Consumer 一起读取消息时,是不能保证消息的时序性的!

另外由于kafka目前只提供单个分区内的消息顺序,而不会维护全局消息顺序,因此如果用户要实现topic全局消息顺序,就只能通过让每个consumer group下只包含一个consumer实例的方式来间接实现的。

小结

最后,我们再简单总结一下:

Kafka中的每一个Consumer都归属于一个特定的Consumer Group,如果不指定,那么所有的Consumer都属于同一个默认的 Consumer Group。Consumer Group 由一个或多个Consumer组成,同一个Consumer Group中的Consumer对同一条消息只消费一次。每个 Consumer Group 都有一个唯一的ID,即Group ID,也称之为 Group Name。Consumer Group 内的所有 Consumer 协调在一起订阅一个Topic的所有Partition,且每个Partition只能由一个 Consumer Group中的一个Consumer进行消费。

参考资料

https://www.luozhiyun.com/archives/260

https://medium.com/javarevisited/kafka-partitions-and-consumer-groups-in-6-mins-9e0e336c6c00

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

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

相关文章

如何低成本打造高效跨国企业内网

随着企业数字化转型的加速,企业对网络连接、安全性和可靠性的需求也变得越来越高,最近小编收到了好几封私信,咨询跨境企业内部组网方案。 投稿的是某跨国公司的IT运维人员,总部在海外,国内分支机构每天都需要进行数据互…

【ASP.NET Core 基础知识】--中间件--什么是中间件

本篇文章作为中间件单元的开篇文章,通过这篇文章可以了解什么是中间件、内置中间件的使用以及怎么创建自定义中间件。我们先来看一下中间件的角色、目的和重要性。 1. 角色 请求处理管道的构建块: 中间件是构成ASP.NET Core请求处理管道的基本组成部分…

[Android]实现一个权限申请类

[Android]实现一个权限申请类 导言 在引入了动态权限申请之后,Android的权限申请就变得尤为繁琐,若是按照原有的方法一板一眼地进行申请,样板代码未免太多。因此本篇文章就使用ActivityResult API,来实现一个简单的权限申请类来帮…

C练习——魔术师猜三位数

题目: 有一种室内互动游戏,魔术师要每位观众心里想一个三位数abc(a、b、c分别是百位、十位和个位数字),然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及这5个数的和值。只要观众说出这个和是多少&#xf…

设计模式之多线程分工模式--- 生产-消费者模式

系列文章目录 设计模式之避免共享的设计模式Immutability(不变性)模式 设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式 设计模式之避免共享的设计模式Copy-on-Write模式 设计模式之避免共享的设计模…

Linux定时删除n天前的数据

Linux定时删除n天前的数据 1.创建删除脚本并授权 touch /home/data/script/shell/auto-del-60-days-ago-log.sh chmod x auto-del-60-days-ago-log.sh 2.编写shell脚本(auto-del-60-days-ago-log.sh) vi auto-del-60-days-ago-log.sh 添加如下内容&a…

Golang 替换数字卡码54题

文章目录 替换数字 54卡码网直接操作读取的[]byte 替换数字 54卡码网 本题为卡码网的54题,起为acm模式的答题 这里我们不在输入获得的[]byte类型上直接修改,而是保存在新建的[]byte上 golang小知识: 单引号’,表示byte类型或rune…

进程的创建与回收学习笔记

目录 一、进程内容: 二、进程常用命令 三、创建子进程 四、子进程进阶 五、进程的退出 六、进程的回收 一、进程内容: 程序: 存放在磁盘上的指令和数据的有序集合(文件) 静态的 进程: 执行一个程序所…

Image Sensor常见分辨率下HTS,VTS设置

本文介绍Image Sensor常见分辨率下HTS,VTS设置。 Image Sensor的HTS,VTS设置非常重要,其与Pixel Clock和FPS有一定的相关性,本文列出常见的分辨率下HTS,VTS的设置。 常见的分辨率下HTS,VTS的设置如下表。…

拍照后的相机logo怎么去掉?看完你就知道了

在日常生活中,拍照已经成为了我们捕捉美好瞬间的习惯。山川湖海、花鸟鱼虫,城市风光、街角趣闻,我们都喜欢用相机或手机留住这些美好的回忆。然而,有时候,当我们按下的那一刹那,一些不速之客——logo&#…

SQL语句详解五-DCL(数据控制语言)

文章目录 DCL管理用户示例代码 权限管理示例代码用户权限 DCL 概述:DCL,数据库控制语言,用来管理用户和给用户授予权限的 管理用户 添加用户 CREATE USER 用户名主机名 IDENTIFIED BY 密码;删除用户 DROP USER 用户名主机名;修改用户密码 S…

安全狗连续3年获得中国网络空间安全协会感谢

在2024年的新年伊始,安全狗依托在2023年期间协助中国网络空间安全协会完成《网络安全态势感知研判分析报告》并支持相关网络安全态势研判工作而获得感谢信。 厦门服云信息科技有限公司(品牌名:安全狗)创办于2013年,是…

3d模型为什么打光只显示黑色---模大狮模型网

3D建模是现代制作动画、电影、游戏等数字媒体内容的重要工具。在建模过程中,打光是一个重要的环节,它可以让3D模型更加真实、有趣和生动。然而,如果打光不当,3D模型可能会呈现出黑色的效果,这可能会让人感到困惑和沮丧…

mybatisplus多租户执行复杂sql(如带case when之类的语句)报错问题

mybatisplus在多租户情况下,执行复杂sql时,会报:Failed to process,Error SQL:select ...,之前版本是加SqlParser注解关闭租户验证,新版本替换为:InterceptorIgnore(tenantLine "1")

vue批量下载图片打包为压缩包

yarn add jszip yarn add file-saver<template><div class"home"><button click"attachDownload">批量下载</button><div class"home_wrap"><div class"home_wrap_item" v-for"item in imageLi…

模拟瑞幸小程序购物车

是根据渡一袁老师的大师课写的&#xff0c;如有什么地方存在问题&#xff0c;还请大家指出来哟ど⁰̷̴͈꒨⁰̷̴͈う♡&#xff5e; index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-e…

浅谈智慧路灯安全智能供电方案设计

摘要: 智慧路灯&#xff0c;作为智慧城市、新基建、城市更新的主要组成部分&#xff0c;近些年在各大城市已得到很好的落地和 应用&#xff0c;但其与传统路灯相比集成大量异元异构电子设备&#xff0c;这些设备的供电电压、接口形式、权属单位各不相同&#xff0c; 如何设计一…

josef约瑟 漏电继电器 LLJ-400F Φ100 分体式结构,导轨安装

LLJ-400F AC660V漏电继电器是一种检测线路触&#xff08;漏&#xff09;电&#xff0c;并发出一个机械开闭信号至控制电路装置。它可与各种规格的低压断路器或交流接触器组成组合式剩余电流动作保护器。在如今已实现了较为完善的农村低压电网分级&#xff08;二级或三级&#x…

软件版本号的划分方式

软件版本号的划分方式可以因不同的开发流程、规范和团队而有所不同。通常&#xff0c;软件版本号由多个部分组成&#xff0c;如"主版本号.次版本号.修订号"&#xff0c;有时还可能包含预发布版本号&#xff08;如alpha、beta或rc&#xff09;。 以下是一种常见的版本…

Apache Solr <= 8.8.1任意文件读取漏洞复现CVE-2019-17558

一、环境准备 搭建环境vulhub&#xff0c;需要提前安装docker环境 docker安装&#xff1a;docker--安装docker-ce-CSDN博客 vulhub地址&#xff1a;https://github.com/vulhub/vulhub #创建靶场环境 mkdir /opt/vulhub cd /opt/vulhub git https://github.com/vulhub/vulhu…