Kafka【十二】消费者拉取主题分区的分配策略

【1】消费者组、leader和follower

消费者想要拉取主题分区的数据,首先必须要加入到一个组中。
在这里插入图片描述
但是一个组中有多个消费者的话,那么每一个消费者该如何消费呢,是不是像图中一样的消费策略呢?如果是的话,那假设消费者组中只有2个消费者或有4个消费者,和分区的数量不匹配,怎么办?

所以这里,我们需要学习Kafka中基本的消费者组中的消费者和分区之间的分配规则:

  • 同一个消费者组的消费者都订阅同一个主题,所以消费者组中的多个消费者可以共同消费一个主题中的所有数据。
  • 为了避免数据被重复消费,所以主题一个分区的数据只能被组中的一个消费者消费,也就是说不能两个消费者同时消费一个分区的数据。但是反过来,一个消费者是可以消费多个分区数据的。
    在这里插入图片描述
  • 消费者组中的消费者数量最好不要超出主题分区的数据,就会导致多出的消费者是无法消费数据的,造成了资源的浪费。
    在这里插入图片描述
    消费者中的每个消费者到底消费哪一个主题分区,这个分配策略其实是由消费者的Leader决定的,这个Leader我们称之为群主。群主是多个消费者中,第一个加入组中的消费者,其他消费者我们称之为Follower,称呼上有点类似与分区的Leader和Follower。
    在这里插入图片描述

当消费者加入群组的时候,会发送一个JoinGroup请求。群主负责给每一个消费者分配分区。每个消费者只知道自己的分配信息,只有群主知道群组内所有消费者的分配信息。

【2】leader指定分配策略的基本流程

(1) 假设第一个消费者设定group.id为test,向当前负载最小的节点发送请求查找消费调度器
在这里插入图片描述
(2) 找到消费调度器后,消费者向调度器节点发出JOIN_GROUP请求,加入消费者组
在这里插入图片描述
(3) 当前消费者当选为群主后,根据消费者配置中分配策略设计分区分配方案,并将分配好的方案告知调度器
在这里插入图片描述
(4) 此时第二个消费者设定group.id为test,申请加入消费者组
在这里插入图片描述
(5) 加入成功后,kafka将消费者组状态切换到准备rebalance,关闭和消费者的所有链接,等待它们重新加入。客户端重新申请加入,kafka从消费者组中挑选一个作为leader,其它的作为follower。(步骤和之前相同,我们假设还是之前的消费者为Leader)

在这里插入图片描述
(6) Leader会按照分配策略对分区进行重分配,并将方案发送给调度器,由调度器通知所有的成员新的分配方案。组成员会按照新的方案重新消费数据
在这里插入图片描述

【3】四种分配策略

① RoundRobinAssignor(轮询分配策略)

每个消费者组中的消费者都会含有一个自动生产的UUID作为memberid。
在这里插入图片描述
轮询策略中会将每个消费者按照memberid进行排序,所有member消费的主题分区根据主题名称进行排序。
在这里插入图片描述
将主题分区轮询分配给对应的订阅用户,注意未订阅当前轮询主题的消费者会跳过。
在这里插入图片描述
在这里插入图片描述

从图中可以看出,轮询分配策略是存在缺点的,并不是那么的均衡,如果test1-2分区能够分配给消费者ccc是不是就完美了。

② RangeAssignor(范围分配策略)

按照每个topic的partition数计算出每个消费者应该分配的分区数量,然后分配,分配的原则就是一个主题的分区尽可能的平均分,如果不能平均分,那就按顺序向前补齐即可。

#所谓按顺序向前补齐就是:
假设【1,2,3,4,5】5个分区分给2个消费者:
5 / 2 = 2, 5 % 2 = 1 => 剩余的一个补在第一个中[2+1][2] => 结果为[1,2,3][4,5]假设【1,2,3,4,5】5个分区分到3个消费者:
5 / 3 = 1, 5 % 3 = 2 => 剩余的两个补在第一个和第二个中[1+1][1+1][1] => 结果为[1,2][3,4][5]

在这里插入图片描述
缺点: Range分配策略针对单个Topic的情况下显得比较均衡,但是假如Topic多的话, member排序靠前的可能会比member排序靠后的负载多很多。
在这里插入图片描述
还有就是如果新增或移除消费者成员,那么会导致每个消费者都需要去建立新的分区节点的连接,更新本地的分区缓存,效率比较低。
在这里插入图片描述

③ StickyAssignor(粘性分区)

在第一次分配后,每个组成员都保留分配给自己的分区信息。如果有消费者加入或退出,那么在进行分区再分配时(一般情况下,消费者退出45s后,才会进行再分配,因为需要考虑可能又恢复的情况),尽可能保证消费者原有的分区不变,重新对加入或退出消费者的分区进行分配。
在这里插入图片描述
在这里插入图片描述
从图中可以看出,粘性分区分配策略分配的会更加均匀和高效一些。

④ CooperativeStickyAssignor

前面的三种分配策略再进行重分配时使用的是EAGER协议,会让当前的所有消费者放弃当前分区,关闭连接,资源清理,重新加入组和等待分配策略。明显效率是比较低的,所以从Kafka2.4版本开始,在粘性分配策略的基础上,优化了重分配的过程,使用的是COOPERATIVE协议。

CooperativeStickyAssignor 是 Apache Kafka 中用于消费者组分区分配的一种策略。它旨在解决传统的轮询(RoundRobin)和粘性(Sticky)分配策略中的一些问题,特别是当消费者组中的消费者动态变化时,能够更有效地保持数据的局部性和均衡性。

什么是 CooperativeStickyAssignor?

CooperativeStickyAssignor 是一种改进的粘性分配策略,它试图在保持消费者组内部的分区分配尽可能稳定的同时,也能应对消费者组成员的变化。这种分配策略的目标是在消费者组成员动态变化的情况下,最小化重新分配对现有消费者的影响。

主要特点

  1. 粘性分配

    • 最小化重新分配:当消费者组中的消费者数量发生变化时,尽量减少重新分配的次数,以保持数据处理的连续性和一致性。
    • 保持局部性:尽量让每个消费者保留其已经处理过的分区,这样可以减少数据的重新加载和处理开销。
  2. 合作分配

    • 动态调整:在消费者组成员变化时,能够动态调整分区分配,使得新增加的消费者能够平滑地加入到处理过程中。
    • 均衡负载:确保每个消费者都能获得均衡的负载,避免过载或资源浪费的情况。

如何工作

CooperativeStickyAssignor 工作的基本原理如下:

  1. 初始化分配

    • 当消费者组首次启动时,分配策略会根据消费者组中的消费者数量和主题的分区数量来分配分区。
  2. 动态调整

    • 当有新的消费者加入时,CooperativeStickyAssignor 会尝试将新加入的消费者分配到负载较少的消费者所拥有的分区中,同时尽量保持原有消费者的分区不变。
    • 当有消费者离开时,CooperativeStickyAssignor 会重新分配离开消费者所拥有的分区,尽量将这些分区分配给其他负载较低的消费者。
  3. 均衡负载

    • 在每次重新分配时,分配器都会考虑消费者的负载情况,确保每个消费者承担的分区数量大致相等。

CooperativeStickyAssignor 是一种先进的分区分配策略,它在保持分区分配的稳定性和局部性的同时,也能有效应对消费者组成员的变化。通过使用这种策略,可以提高消费者组处理数据的效率和稳定性。

【5】不同版本默认分配策略

Kafka 0.10.x 及之前版本

在 Kafka 0.10.x 及之前的版本中,默认的分区分配策略是 范围分配策略(Range Assignor)。这种策略会根据消费者的加入顺序来分配分区,每个消费者会获得一定范围内的分区。

Kafka 0.11.x 及之后版本

从 Kafka 0.11.x 版本开始,默认的分区分配策略是 粘性分配策略(Sticky Assignor)。粘性分配策略旨在保持消费者组中分区分配的稳定性,即在消费者组中的消费者数量发生变化时,尽量保持分区分配的一致性,减少重新分配的频率,从而降低数据处理的开销。

然而,值得注意的是,从 Kafka 2.8 版本开始,引入了 合作粘性分配策略(Cooperative Sticky Assignor),这是一种改进版的粘性分配策略。虽然默认分配策略仍然是 Sticky Assignor,但 CooperativeStickyAssignor 作为一种更高级的分配策略,已经在很多场景中被推荐使用。

分配策略的比较

  1. Range Assignor

    • 在 Kafka 0.10.x 及之前版本中,默认使用 Range Assignor。
    • 这种策略按照消费者的加入顺序分配分区,每个消费者会获得一个连续的分区范围。
    • 缺点是当消费者组中的消费者数量发生变化时,可能会导致较大的重新分配,影响性能。
  2. Sticky Assignor

    • 从 Kafka 0.11.x 开始,默认使用 Sticky Assignor。
    • 目标是在消费者组中的消费者数量发生变化时,尽量保持分区分配的一致性,减少重新分配。
    • 适用于需要保持分区分配稳定性的场景。
  3. CooperativeStickyAssignor

    • 从 Kafka 2.8 版本开始引入。
    • 这种策略进一步优化了 Sticky Assignor,使得在消费者组中的消费者数量发生变化时,能够更平滑地进行分区重新分配。
    • 特别适用于需要动态调整消费者数量的场景。

总结

  • 在 Kafka 0.10.x 及之前的版本中,默认的分区分配策略是 Range Assignor。
  • 在 Kafka 0.11.x 及之后的版本中,默认的分区分配策略是 Sticky Assignor。
  • 从 Kafka 2.8 版本开始,引入了 CooperativeStickyAssignor,这是一种更高级的粘性分配策略,虽然不是默认的分配策略,但在很多场景中被推荐使用。

通过合理的分区分配策略选择,可以优化消费者组的性能和稳定性。

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

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

相关文章

C语言-程序环境 #预处理 #编译 #汇编 #链接 #执行环境

文章目录 前言 一、程序的环境翻译和执行环境 二、翻译环境 (一)、整体把握 (一)、编译 1、预处理(预编译) 2、编译 a、词法分析 b、语法分析 c、语义分析 d、符号汇总 3、汇编 (二)、链接 三、运行环境 总结​​​​​​​ 前言 路漫漫其修远兮,吾将…

9月7日微语报,星期六,农历八月初五

9月7日微语报,星期六,农历八月初五,周末愉快! 一份微语报,众览天下事! 1、21个部门:符合条件的流动儿童家庭或可配公租房。 2、多所高校2025年招生简章显示&#xff0…

API安全 | 发现API的5个小tips

在安全测试目标时,最有趣的测试部分是它的 API。API 是动态的,它们比应用程序的其他部分更新得更频繁,并且负责许多后端繁重的工作。在现代应用程序中,我们通常会看到 REST API,但也会看到其他形式,例如 Gr…

Jenkins构建CI/CD

CI/CD 软件开发的连续方法基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预。 它涉及在每次小迭代中不断构建,测试和部署代码更改,从而减少…

对极约束及其性质 —— 公式详细推导

Title: 对极约束及其性质 —— 公式详细推导 文章目录 前言1. 对极约束 (Epipolar Constraint)2. 坐标转换 (Coordinate Transformations)3. 像素坐标 (Pixel Coordinates)4. 像素坐标转换 (Transformations of Pixel Coordinates)5. 本质矩阵 (Essential Matrix)6. 线坐标 (Co…

单调栈的实现

这是C算法基础-数据结构专栏的第二十四篇文章,专栏详情请见此处。 引入 单调栈就是满足单调性的栈结构,它最经典的应用就是给定一个序列,找出每个数左边离它最近的比它大/小的数。 下面我们就来讲单调栈的实现。 定义 单调栈就是满足单调性…

pycharm破解教程

下载pycharm https://www.jetbrains.com/pycharm/download/other.html 破解网站 https://hardbin.com/ipfs/bafybeih65no5dklpqfe346wyeiak6wzemv5d7z2ya7nssdgwdz4xrmdu6i/ 点击下载破解程序 安装pycharm 自己选择安装路径 安装完成后运行破解程序 等到Done图标出现 选择Ac…

精准设计与高效开发:用六西格玛设计DFSS实现新能源汽车开发突破

快速变化的市场需求和激烈的竞争迫使制造企业不得不持续创新和优化产品开发流程。如何在保证产品质量的前提下,加快产品开发周期,成为许多企业亟待解决的问题。六西格玛中的DFSS(Design for Six Sigma)模型提供了一种系统的方法&a…

【银河麒麟高级服务器操作系统实例】虚拟化平台系统服务中断现象分析及处理建议

服务器环境以及配置 【机型】虚机 处理器: Kunpeng-920 内存: 40G 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 银河麒麟操作系统 Kylin-Server-10-SP1-Release-Build20-20210518-arm64 【第三方软件】 智能运维系统、mysq…

5G移动网络运维实验(训)室解决方案

随着第五代移动通信技术(5G)的快速普及和工业互联网的迅猛发展,全球制造业正面临着前所未有的深刻变革。5G技术凭借其超高的传输速率、极低的延迟以及大规模的连接能力,为工业自动化、智能制造等领域带来了革命性的技术支持。为了…

Vatee万腾平台:赋能企业,共筑智慧经济新高地

在智慧经济时代的大潮中,企业如何把握机遇,实现转型升级,成为行业内的佼佼者?Vatee万腾平台以其卓越的技术实力、前瞻性的战略眼光和全方位的服务体系,正逐步成为企业数字化转型的坚实后盾,赋能企业&#x…

软考真题之软件设计师的程序语言设计题型(上午题)

目录 编程程序和解释程序 相关习题 函数 编译,解释和翻译阶段 符号表 ​编辑 相关习题 ​编辑 词法分析 语法分析 语义分析 目标代码生成 相关习题 中间代码生成 正规式 相关习题 有限自动机 相关习题 上下文无关文法 相关习题 比较偏的真题 编程程序和解…

Python OpenCV 影像处理:傅立叶转换

►前言 上篇介绍基于计算影像的梯度,通过在影像中找到梯度值的变化来识别边缘。 本篇将介绍傅立叶变换的基本原理,了解傅立叶变换是如何将影像从空间域转换到频率域的,以及为什么这种转换在影像处理过程中是有用的。以及傅立叶变换的实际应…

微服务日常总结

1.当我们在开发中,需要连接多个库时,可以在yml中进行配置。 当在查询的时候,跨库时,需要通过DS 注解来指定,需要yml配置需要保持一致。 2. 当我们想把数据存入到clob类型中,需要再字段 的占位符后面加上j…

微服务--Nacos

一、Nacos简介 Nacos(Naming and Configuration Service)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它致力于帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos支持几乎所有主流类型的服…

AFSim 仿真系统----性能工具

什么是 WPR/WPA? Windows 性能记录器 (WPR) 和 Windows 性能分析器 (WPA) 是 Windows 性能工具包中提供的性能监控工具。它们是免费的工具,可以通过下载和安装 Windows 评估和部署工具包 (ADK) 来获得。 WPR 是一个工具,允许用户动态部署事…

【LeetCode】09.回文数

题目要求 解题思路 主要是提防越界问题 代码实现 class Solution { public:bool isPalindrome(int x) {//处理边界if(x<0) return false;long tempx,ret0;while(temp){retret*10temp%10;temp/10;}return xret;} };

线性代数|机器学习-P34神经网络和学习函数

文章目录 1. 神经网络2. 损失函数3. 距离矩阵 1. 神经网络 构建一个神经网络步骤如下&#xff1a; 构建一个神经网络 构造一个学习函数 F ( x , v ) F(x,v) F(x,v),x代表权重 A k , b k A_k,b_k Ak​,bk​&#xff0c;v代表样本特征向量,ReLu激活函数 v 1 R e L u [ F ( A …

Windows安装anaconda注意事项及jupyter notebook更换目录

anaconda的介绍就不罗嗦了&#xff0c;既然准备安装了&#xff0c;说明你已经有所了解了。直入主题&#xff0c;Anaconda官网下载&#xff0c;实在太慢&#xff0c;可到https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载&#xff0c;注意&#xff0c;这是清华镜像站…

深度评测热门翻译工具,携手你的翻译得力助手

随着互联网技术的飞速发展&#xff0c;全球化交流日益频繁&#xff0c;跨语言沟通的需求也随之激增。对于外语水平有限的朋友来说&#xff0c;翻译器是一个必不可少的工具。今天我就分享几款我用的翻译器吧。 1.福晰在线翻译 链接直达>>https://fanyi.pdf365.cn/doc …