10、Kafka ------ 消费者组 和 消费者实例,分区 和 消费者实例 之间的分配策略

目录

  • 消费者组 和 消费者实例
    • ★ 消费者组
    • ★ 分区 和 消费者实例
    • ★ 分配分区(分区 和 消费者实例 之间的分配策略)
      • 3种分配策略
        • ★ range策略
        • ★ round-robin策略 (轮询)
        • ★ stick策略
      • 如何指定分配分区的策略:

消费者组 和 消费者实例


★ 消费者组

形象来说:你可以把主题内的多个分区当成多个子任务、多个子任务组成项目,每个消费者实例就相当于一个员工,假如你们 team 包含2个员工。

  项目         主题              team(2个员工)

 5个子任务      分区

 ——每个子任务只会分给一个同一team的一个员工。

同理:

同一主题下,每个分区最多只会分给同一个组内的一个消费者实例

消费者以组的名义来订阅主题,前面的 kafka-console-consumer.bat 命令可通过–group选项来指定组ID。

一个主题包含多个分区,一个消费者组也包含多个消费者实例。同一个消费者组内的所有消费者共享一个公共的ID,这个ID被称为组ID。

同一组的多个消费者实例对外表现为一个整体(group、team),消费者实例整体一组的形式订阅一个主题。

同一消费组内的多个消费者实例一起协调消费主题所包含的全部分区,

因此:

同一个主题下每个分区只能由同一个组内的一个消费者实例来消费,但一个消费者实例可负责消费多个不同的分区。

由此可以发现:

同一消费者组内,多个消费者实例绝不可能获去同一个消息主题内的相同消息——这就是典型P2P模型

不同消费者组,它们将会读到同一个消息主题内完全相同的消息,
——这就是典型Pub-Sub模型

同一组内多个消费者实例就是模拟了P2P模型。不同组内多个消费者就是模拟了Pub-Sub模型。



简单来说:
1、一个主题有多个分区,一个消费者组有多个消费者实例
2、然后这个消费者组中的消费者实例A,它消费过的分区,其他同组的消费者实例B就不能去消费了,可以避免消息被重复消费。
3、但是一个消费者实例可以消费多个主题下的不同分区。
4、不同消费者组的消费者实例,可以读取同一个主题下的同一个分区里面的消息。
在这里插入图片描述



★ 分区 和 消费者实例


理想情况下,消费者组中的消费者实例的数量恰好等于该组所订阅主题内的总分区数,这样每个消费者实例恰好负责处理一个分区。

否则还有可能出现如下两种情况:

1、消费者实例数大于所订阅主题的分区数:
一个消费者实例要负责一个分区。但会有几个消费者实例处理空闲状态。

2、消费者实例数小于所订阅主题的分区数:
此时一个消费者实例要负责多个分区。

第一种情况无非是造成了消费者实例的浪费(消费者实例也是一个进程,但它永远无事可做);

但大部分时候,通常都是上面的第二种情况,此时就需要处理为消费者实例分配分区的问题。



★ 分配分区(分区 和 消费者实例 之间的分配策略)

3种分配策略

Kafka为消费者实例分配分区时提供了3种分配策略
就是为消费者实例分配它们要消费的分区的信息。

1、range策略。

2、round-robin策略。

3、sticky策略。



★ range策略

Kafka 默认是这个 range 策略

range策略看上去是公平,但实际上并不公平。

range策略是基于【每个主题】进行单独分配的,其大致步骤如下:

1、将每个主题内分区按数字顺序进行排序,消费者则按消费者名称的字典顺序进行排序。

2、用主题内的分区总数除以消费者总数,如果恰好能除尽,则每个消费者实例都分得相同数量(就是除得的商)的分区;
如果除不尽,排在前面的几个消费者将会分得额外的分区。



如图:一开始在想,为什么不是P0给C0,P1给C1,然后P2再给C0。

其实range策略是先算主题下有几个分区,然后消费者组有几个实例,然后计算每个实例消费几个分区,然后再来分配的。

如图,在range策略计算下,C0 要消费2个分区,C1要消费1个分区,所以在分配分区的时候,就把前面两个分区分配给C0实例,然后后面一个分区就分配给C1实例。


在有多个主题的情况下,range策略也是一个主题一个主题来单独分配的,

如图:现在有两个主题,一共有6个分区,然后有两个消费者实例,按理说应该一个实例消费三个分区,但是range策略是一个主题一个主题来分配的,
所以C0 在主题T0 分配到了两个分区,在主题T1那里也分配到了两个分区,
所以最后C0实例需要消费4个分区,而C1实例只需要消费2个分区,这个是不合理的。

这样容易造成 C1 实例的资源浪费

在这里插入图片描述



★ round-robin策略 (轮询)

round-robin策略会把【所有订阅主题的所有分区】按顺序排开,然后采用轮询方式依次分给各消费者实例。

由此可见,
round-robin策略 与 range策略 最大的不同就是它不再局限于单个主题进行分配,而是将所有订阅主题作为整体来进行分配

很明显,round-robin策略要更公平一些。

在这里插入图片描述



★ stick策略

——尽量只对改动部分进行重分配,尽力维护既有的分配方案。

sticky策略 主要是为了处理重平衡(rebalance) 需求,重平衡就是重新为消费者实例分配分区的过程

比如以下三种情况就会触发重平衡:

  • 组中消费者实例的数量发生变化。 比如有新的消费者实例加入消费者组,或者有消费者实例退出了消费者组。

  • 订阅的主题数发生改变。 当消费者组以正则表达式的方式订阅主题时,符合正则表达式的主题可能会动态地变化。

  • 某个或某几个订阅主题的分区数发生改变。当主题内分区数增加时,必须为之分配消费者实例来处理它。

当触发重平衡处理时,如果使用 range 或 round-robin策略,Kafka会【彻底抛弃】原有的分配方案,对变化后的消费者实例、分区进行彻底的重新分配。

而 sticky策略 则有效地避免了上述两种策略的缺点,sticky策略 会尽力维持了之前的分配方案,只对改动部分进行最小的再分配,因此通常认为 sticky策略 在处理重平衡时具有最佳的性能。



如何指定分配分区的策略:

可以在配置文件中指定策略,也可以在代码中指定。

通过如下属性:
partition.assignment.strategy

org.apache.kafka.clients.consumer.RangeAssignor:range策略

org.apache.kafka.clients.consumer.RoundRobinAssignor: round-robin策略

org.apache.kafka.clients.consumer.StickyAssignor: stick策略

在这里插入图片描述

百度查看是这么设置的,具体待后续研究:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git 基本使用

Git Git是一种分布式版本控制系统,它可以帮助开发团队更好地管理代码并进行协同开发。 gitee,github,gitlab,是基于git的代码托管平台。 官方文档地址(中文):Git - Git 是什么? 安装和配置 官网下载地址:Git - Downl…

面试官心声:个个都说会自动化,结果面试一问细节全露馅了

今年我们部门计划招聘几名自动化测试工程师,为此我进行了面试和培训,发现了一个让我感到担忧的趋势,许多候选人可以轻松地回答有关脚本编写、元素定位、框架API等问题。然而一问到实际项目,比如 “如何从0开始搭建自动化体系”、“…

k8s---pod控制器

pod控制器发的概念: 工作负载,workload用于管理pod的中间层,确保pod资源符合预期的状态。 预期状态: 1、副本数 2、容器重启策略 3、镜像拉取策略 pod出故障的出去等等 pod控制器的类型: 1、replicaset&#xf…

from表单通过遍历的方式显示

当我们绘制表单数据的时候&#xff0c;有时候知道需要绘制的内容&#xff0c;但是不想在页面一条一条写数据&#xff0c;如果通过遍历显示呢 下面是在uniapp中写h5的方法&#xff0c;直接上代码 <view><view classitem v-for(item,index) in arr :keyindex><v…

【学习资源】分享三个文献互助平台(科研通 / 谷粉 / 纬度)

最近博主准备阅读一些专业相关的文献&#xff0c;有一些可以从博主所在单位购买的数据中直接下载&#xff0c;然而有一些论文数据库是没有购买的&#xff0c;所以要博主自己想办法去下载。 一般来说&#xff0c;两年以前的SCI论文&#xff0c;基本上都可以借助Scihub下载的到&…

pc端微信QQ使用代理解决方案

背景 多数金融类公司都会限制QQ和微信访问&#xff0c;但某些情况导致不得不使用&#xff0c;时不时使用手机会让你的老板感觉你在摸鱼&#xff0c;所以站在技术的角度上研究一下如果在pc端使用 代理开启 以微信举例&#xff0c;如果你用的clash&#xff0c;这里的地址可以设…

2024 解决matplotlib中文字体问题

第一种代码&#xff08;失败代码&#xff09; import matplotlib as mpl import matplotlib.pyplot as plt from matplotlib.font_manager import FontPropertiesfont_path /Users/huangbaixi/Desktop/SimHei.ttfdef plot_demo():#print(mpl.get_cachedir())# 绘制折线图font…

人脸考勤技术,这个隐藏功能太好用了!

随着科技的不断发展&#xff0c;人脸识别技术在各个领域得到了广泛的应用。其中&#xff0c;三维人脸考勤系统作为一种高级的人脸识别技术&#xff0c;不仅提高了考勤系统的准确性&#xff0c;还增强了安全性。 客户案例 制造企业 山东某大型制造企业引入了泛地缘科技推出的三…

【excel密码】Excel中如何使部分单元格区域实现加密

Excel文件可以设置保护工作表&#xff0c;那么可以只保护工作表中的部分单元格&#xff0c;其他地方可以正常编辑吗&#xff1f;当然是可以的&#xff0c;今天我们学习&#xff0c;如何设置保护部分单元格。 首先&#xff0c;我们先将整张工作表选中&#xff08;Ctrl A&#…

【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II

作者推荐 【矩阵快速幂】封装类及测试用例及样例 本文涉及的基础知识点 二分查找算法合集 LeetCode100207. 找出数组中的美丽下标 II 给你一个下标从 0 开始的字符串 s 、字符串 a 、字符串 b 和一个整数 k 。 如果下标 i 满足以下条件&#xff0c;则认为它是一个 美丽下标…

主流浏览器设置代理IP之QQ浏览器

给浏览器设置代理IP是目前代理IP的主流使用场景之一&#xff0c;接下来小编就手把手教你如何对QQ浏览器进行代理IP设置 注&#xff1a;本次使用IP来源于携趣代理平台QQ浏览器内设置IP代理 1、首先需要进入浏览器【设置】 2.点击【工具】选择【lnternet选项】然后进行点击。 3.…

零基础精酿啤酒,这款智能啤酒酿造机掀起啤酒消费的DIY热潮

破壁机、台式单烤、空气炸锅……回顾2023年&#xff0c;小家电行业在高端、智能等趋势下迎来了新一轮的消费迭代热潮&#xff0c;越来越多契合消费者细分需求的“新兴家电”正在成为市场新宠。比如&#xff0c;此前很少有消费者会关注的啤酒酿造机。 啤酒如何酿造&#xff1f;…

Unity ComputeShader 使用GPU快速计算复杂问题

Unity ComputeShader 使用GPU快速计算复杂问题 前言项目创建ComputeShader编写CompturShader创建Unity代码场景布置运行场景 参考 前言 遇到一个问题&#xff0c;需要大量的计算&#xff0c;在Unity中直接写会长时间的阻塞主线程&#xff0c;正好使用ComputeShader让GPU来帮我…

Windows 下 QT开发环境的搭建:

下载QT:Index of /archive/qt/5.14 下载Cmake :CMake - Upgrade Your Software Build System (1)QT在windows,C, 打包exe&#xff1a; step1:window上安装QT软件&#xff1a; Windows下的QT系统开发环境搭建_qt windows-CSDN博客. step2:新建一个界面工程&#xff1a; (1)打…

C++标准学习--智能指针

shared_ptr和weak_ptr的配合使用是个问题。unique_ptr的使用场合似乎比较局限。 文章C 智能指针详解&#xff08;一&#xff09;——unique_ptr - 知乎 (zhihu.com) 介绍了unique_ptr的使用。它可以由shared_ptr转来&#xff0c;主要用到了std::move。 主要场景其中提到&#…

WaitForSingleObject 函数的诸多用途与使用场景总结

目录 1、WaitForSingleObject函数详细说明 2、在线程函数中调用WaitForSingleObject实现Sleep&#xff0c;可立即退出Sleep状态 3、调用WaitForSingleObject函数监测线程或进程是否已经退出 3.1、子进程实时监测主进程是否已经退出&#xff0c;主进程退出了&#xff0c;则子…

第一个Python程序_获取网页 HTML 信息[Python爬虫学习笔记]

使用 Python 内置的 urllib 库获取网页的 html 信息。注意&#xff0c;urllib 库属于 Python 的标准库模块&#xff0c;无须单独安装&#xff0c;它是 Python 爬虫的常用模块。 获取网页 HTML 信息 1) 获取响应对象 向百度&#xff08;http://www.baidu.com/&#xff09;发起…

UML-用例图

提示&#xff1a;用例图是软件建模的开始&#xff0c;软件建模中的其他图形都将以用例图为依据。用例图列举了系统所需要实现的所有功能&#xff0c;除了用于软件开发的需求分析阶段&#xff0c;也可用于软件的系统测试阶段。 UML-用例图 一、用例图的基础知识1.用例图的构成元…

网页屏幕适配通透了

一&#xff0c;如果设计尺寸固定 那就按照固定尺寸开发 一般都是1920*1080 二&#xff0c;需要适配多种像素屏幕&#xff08;大屏可视化&#xff09; 可使用媒体查询设置多套css样式或者使用自适应单位&#xff0c;%&#xff0c;vw&#xff0c;vh 最好解决方案rem&#xff…