Kafka 消费者组

news2025/1/16 21:17:23

Kafka 消费者组

  • Consumer数
  • 位移
  • 重平衡

消费者组 (Consumer Group) : 可扩展且容错性的消费者机制

  • 一个组内可能有多个消费者 (Consumer Instance) : 共享一个公共 ID (Group ID)
  • 组内的所有消费者协调消费订阅主题 (Subscribed Topics) 的所有分区 (Partition)
  • 每个分区只能由同个消费者组内的一个 Consumer 消费

Consumer Group 的特性:

  1. Consumer Group :有 n 个 Consumer。一个 Consumer 可能是进程或线程
  2. Group ID (字符串) : 标识唯一 Consumer Group
  3. Consumer Group 订阅的主题的单个分区,只能由组内的某个 Consumer 消费

两种消息引擎模型 :

  • 俩种的伸缩性 (scalability) 都差
  • 点对点模型 : 消费队列 : 消息一被消费,就从队列中删除,只能被一个 Consumer 消费
  • 发布/订阅模型 : 允许消息被多个 Consumer 消费

Consumer Group :

  • 解决伸缩性 (scalability) 差问题
  • 消息队列模型 :所有实例都属于同一个 Group
  • 发布 / 订阅模型 :所有实例分别属于不同的 Group

Consumer Group 伸缩性 :

  • Consumer Group 订阅了多个主题后,组内的每个实例不要求一定要订阅主题的所有分区,它只会消费部分分区中的消息
  • Consumer Group 之间彼此独立,互不影响,它们能够订阅相同的一组主题而互不干涉
  • Broker 端的消息留存机制,Kafka 的 Consumer Group 能规避伸缩性差的问题

Consumer数

Consumer Group 下理想 Consumer 数 :

  • Consumer 数 = 该 Group 订阅主题的分区总数

例子 :

  • 一个 Consumer Group 订阅了 3 个主题
  • A、B、C 的分区数分别是1 , 2 , 3 ,该 Group 的总分区数是 6
  • 为该 Group 设置 6 个 Consumer ,能最大限度实现高伸缩性

设置 > 或 < 6 :

  • 设 3 个 Consumer,每个 Consumer 平均消费 2 个分区 (6/3)
  • 设 8 个 Consumer,有 2 (8 – 6) 个 Consumer 无法被分配分区,处于空闲状态
  • 生产中,不推荐设 Consumer 数 > 总分区数,多余的 Consumer 会浪费资源

位移

Kafka 管理位移 :

  • 消费位置信息 : 位移 (Offset) : 消费者在消费时 ,记录消费条数
  • Offset 类似于一组 KV 对 :Key : 分区;V : Consumer 消费该分区的最新位移
  • 用 Java 类似结构 (Map<TopicPartition, Long>) : TopicPartition : 一个分区,Long : 位移的类型

Kafka 有新旧 Consumer :

  • 新旧 Consumer 的管理位移方式不一样
  • 老 Consumer Group 把位移放在 ZK , 减少 Broker 开销
  • 新 Consumer Group 把位移放在 __consumer_offsets 主题

ZK 不适合频繁的写更新

  • Consumer Group 的位移更新是频繁操作
  • 大量写操作会拖慢 ZK 集群的性能

重平衡

Rebalance :

  • 协议规定 Group 下的所有 Consumer 怎么分配订阅 Topic 的每个分区
  • Rebalance 时,Group 下所有的 Consumer 都要一起参与

Rebalance 触发条件 :

  • 组内成员数变化 : 有新 Consumer 加入/离开组或 Consumer 异常被踢出组
  • 订阅主题数变化 : 新创的主题 , 被 Group 订阅了 , 该 Group 就会 Rebalance
  • 订阅主题的分区数变化 : 增加主题的分区数,订阅该主题的所有 Group 会 Rebalance

Rebalance 的 3 种分配策略 :

  • 都是为了公平分配 : 每个 Consumer 分配平均的分区数
  • 如 : 一个 Group 内有 10 个 Consumer,要消费 100 个分区,理想的分配策略 : 每个 Consumer 平均分配 10 个分区
  • 当有分配倾斜,就会忙死/闲死

Group 发生 Rebalance :

  • 设某个 Group 有两个 Consumer,如 : A/B
  • 当 C 加入时,会触发 Rebalance,并按照分配策略重新为 A、B 和 C 分配分区
  • Rebalance 后的公平分配 : 每个 Consumer 消费 2 个分区

在这里插入图片描述

Rebalance 对 Consumer Group 消费影响大

  • Rebalance 类似 JVM 的 STW
  • Rebalance 时,所有 Consumer 都会停止消费,等待 Rebalance 完成

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

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

相关文章

【1】熟悉刷题平台操作

TestBench使用 与quartus中testbench的写法有些许。或者说这是平台特有的特性&#xff01;&#xff01; 1 平台使用谨记 &#xff08;1&#xff09;必须删除&#xff1a;若设计为组合逻辑&#xff0c;需将自动生成的clk删除 若不删除&#xff0c;会提示运行超时错误。 &#…

git推送指定的提交到远程分支详细方法

默认情况下&#xff0c;git push会推送暂存区所有提交&#xff08;也即HEAD及其之前的提交&#xff09;到远程库&#xff0c;实际开发中可能因为功能没有开发完成&#xff0c;但是又必须提交部分修改好的代码就需要用到推送指定commit到远程分支。第一种方式&#xff1a;即符合…

CSS流动布局-页面自适应

项目中经常会碰到页面自适应的问题&#xff0c;例如&#xff1a;商城的列表展示、分类列表展示等页面&#xff0c;如下&#xff1a; 该页面会随着页面的放大缩小而随之发生变化&#xff0c;这种自适应的页面布局在大屏幕、小屏幕、不同的浏览器设备上都应该呈现出与设计匹配的…

【STM32MP157应用编程】4.串口接收、发送数据

目录 串口文件 指令操作串口 程序操作串口 程序说明 程序代码 4_ChuanKou_2.c 启动交叉编译工具 编译 拷贝到开发板 测试 串口文件 在/dev目录下&#xff0c;存放了串口的文件。 文件名对应的串口ttySTM0CH340ttySTM1com2&#xff08;公头&#xff09;ttySTM2com1&a…

java版云HIS系统源码 微服务架构支持VUE

云his系统源码 一个好的HIS系统&#xff0c;要具有开放性&#xff0c;便于扩展升级&#xff0c;增加新的功能模块&#xff0c;支撑好医院的业务的拓展&#xff0c;而且可以反过来给医院赋能&#xff0c;最终向更多的患者提供更好地服务。 私信了解更多&#xff01; 本套基于…

【C语言】结构体和共用体

目录一、结构体&#xff08;一&#xff09;结构体声明&#xff08;二&#xff09;结构体变量定义&#xff08;三&#xff09;结构体变量的初始化&#xff08;四&#xff09;结构体的引用&#xff08;五&#xff09;结构体数组二、共用体&#xff08;一&#xff09;共用体定义&a…

全球商城库存系统架构设计与实践

业务背景 商城原库存系统耦合在商品系统&#xff0c;考虑到相关业务逻辑复杂度越来越高&#xff0c;库存做了服务拆分&#xff0c;在可售库存管理的基础上新增了实物库存管理、秒杀库存、物流时效 、发货限制、分仓管理等功能&#xff0c;满足了商城库存相关业务需求。 系统架构…

GitLab 存储型XSS漏洞 (CVE-2023-0050)

漏洞描述 GitLab 是由GitLab公司开发的、基于Git的集成软件开发平台。kroki是一款集成在GitLab的基于文本的图表描述自动转为图片的开源工具&#xff0c;在GitLab 13.7引入。 由于Kroki中lib/banzai/filter/kroki_filter.rb对接收的image_src过滤不严&#xff0c;具有AsciiDo…

SpringBoot 整合 clickhouse和mysql 手把手教程全网最详细

最近做一个项目 需要 整合mysql clickhouse 多数据源 后台用的是ruoyi框架 1. 首先pom引入相关依赖 <!--JDBC-clickhouse数据库--><dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version&…

Homekit智能家居产品---智能吸顶灯

买灯要看什么因素 好灯具的灯光可以说是家居的“魔术师”&#xff0c;除了实用的照明功能外&#xff0c;对细节的把控也非常到位。那么该如何选到一款各方面合适的灯呢&#xff1f; 照度 可以简单理解为清晰度&#xff0c;复杂点套公式来说照度光通量&#xff08;亮度&#x…

5款小巧好用的电脑软件,让你的工作生活更加高效!

不得不说良心好软件让大家好评连连&#xff0c;爱不释手&#xff0c;不像某些软件自带广告弹窗。这期就由我给大家安利几款电脑中的得力助手&#xff0c;看看你都用过几个&#xff1f; 1.桌面管理神器——Coodesker Coodesker是一款免费小巧、无广告&#xff0c;功能简单的桌…

【Redis】哨兵机制(三)

目录 3.Redis哨兵 3.1.哨兵原理 3.1.1.集群结构和作用 3.1.2.集群监控原理 3.1.3.集群故障恢复原理 3.1.4.小结 3.2.搭建哨兵集群 3.3.RedisTemplate 3.3.1.导入Demo工程 3.3.2.引入依赖 3.3.3.配置Redis地址 3.3.4.配置读写分离 3.Redis哨兵 Redis提供了哨兵&am…

Spring Cloud Gateway学习

文章大纲 为什么需要网关&#xff1f; 传统的单体架构只有一个服务开放给客户端调用&#xff0c;但是在微服务架构体系中是将一个系统拆分成多个微服务&#xff0c;那么作为客户端如何去调用这些微服务呢&#xff1f;如果没有网关的存在&#xff0c;就只能在本地记录每个微服务…

彻底关闭Windows10更新!!

以下四个步骤都需要执行。 一、禁用Windows Update服务 1、同时按下键盘 Win R&#xff0c;然后输入 services.msc &#xff0c;点击确定。 2、找到 Windows Update 这一项&#xff0c;并双击打开。 3、双击打开它&#xff0c;点击 停止&#xff0c;把启动类型选为 禁用&…

SpringBoot+@Async注解-异步调用

编程开发里&#xff0c;使用java异步执行方法可以让程序同时处理多个请求业务&#xff0c;提升吞吐量来缩短业务的执行时间&#xff0c;在springboot的程序应用中&#xff0c;提供了Async注解来实现异步执行方法。在业务开发中&#xff0c;有些时候是不需要立即返回业务的处理结…

前端代码质量-圈复杂度原理和实践

1. 导读 你们是否也有过下面的想法&#xff1f; 重构一个项目还不如新开发一个项目…这代码是谁写的&#xff0c;我真想… 你们的项目中是否也存在下面的问题&#xff1f; 单个项目也越来越庞大&#xff0c;团队成员代码风格不一致&#xff0c;无法对整体的代码质量做全面的…

【LeetCode】剑指 Offer 25. 合并两个排序的链表 p145 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/ 1. 题目介绍&#xff08;25. 合并两个排序的链表&#xff09; 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 【测试用例】&#xf…

软件测试分类知识分享,第三方软件测试机构收费贵不贵?

软件测试可以很好的检验软件产品的质量以及规避产品上线之后可能会发生的错误&#xff0c;随着技术的发展&#xff0c;软件测试已经是一个完整且体系庞大的测试活动&#xff0c;不同的测试领域有着不同的测试方法、技术与名称&#xff0c;那么具体有哪些分类呢? 一、软件测试…

centos7部署KVM虚拟化

目录 centos7部署KVM虚拟化平台 1、新建一台虚拟机 2、系统内的操作 1、修改主机名 2、挂载镜像光盘 3、ssh优化 4、设置本地yum仓库 5、关闭防火墙&#xff0c;selinux 3、安装KVM 4、设置KVM网络 5、KVM部署与管理 6、使用虚拟系统管理器管理虚拟机 创建存储池 …

[曾经沧海难为水]两数求和

本来可以面试成功就差HR面试了&#xff0c;现在给我说恒英也要机试题了。我现在肝机试题吧&#xff01;大环境就是这&#xff0c;记录两周一个机试学习过程V1&#xff1a;自己写的暴力法V2&#xff1a;暴力法2:通过python的**str in list**方式逐个遍历&#xff0c;虽然代码看似…