kafka消费端之分区分配策略

文章目录

  • 概述
  • 分区分配策略
    • RangeAssignor分配策略
    • RoundRobinAssignor分配策略
    • StickyAssignor
    • 自定义分区分配策略
  • 总结

概述

我们知道kafka的topic可以被分成多个分区,消费者在集群模式下消费时一个消费组内的每个消费者实例只能消费到一个分区的消息,那么他们是怎么进行分区消费策略的设置的?默认是什么策略?能否存在不同消费者使用不同的分区分配策略?能否一个消费者设置两种分区分配策略?能否自己设置一个策略(自定义分区消费策略这部分会省略讲)?我们可以带着这些问题入手了解这部分的内容。

Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。默认情况下,此参数的值为org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka还提供了另外两种分配策略:RoundRobinAssignor和StickyAssignor。消费者客户端参数partition.assignment·Strategy可以配置多个分配策略,彼此之间以逗号分隔。

分区分配策略

RangeAssignor分配策略

RangeAssignor分配策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。对于每一个主题,RangeAssignor策略会将消费组内所有订阅这个主题的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。如:一个主题T,存在5个分区(p0,p1,p2,p3,p4),存在一个包含2个实例的消费组(n0,n1)。那么可能得消费是这样的,n0消费p0,p1,p2这3个分区,n2消费p3,p4这两个分区。

RoundRobinAssignor分配策略

RoundRobinAssignor 分配策略的原理是将消费组内所有消费者及消费者订阅的所有主题的分区按照字典序排序,然后通过轮询方式逐个将分区依次分配给每个消费者。RoundRobinAssignor分配策略对应的partition.assignment.strategy参数值为org.pache.kafka.clients.consumer.RoundRobinAssignor 。如:一个主题T,存在5个分区(p0,p1,p2,p3,p4),存在一个包含2个实例的消费组(n0,n1)。那么可能得消费是这样的,n0消费p0,p2,p4这3个分区,n1消费p1,p3这两个分区。

StickyAssignor

我们再来看一下StickyAssignor分配策略,“sticky”这个单词可以翻译为“黏性的”,Kafka从0.11.x版本开始引入这种分配策略,它主要有两个目的
(1)分区的分配要尽可能均匀。
(2)分区的分配尽可能与上次分配的保持相同。

当两者发生冲突时,第一个目标优先于第二个目标。鉴于这两个目标,StickyAssignor分配策略的具体实现要比RangeAssignor和RoundRobinAssignor这两种分配策略要复杂得多。如:消费组内有3个消费者(n0、n1和n2),它们都订阅了4个主题(t0、t1、t2、t3),
并且每个主题有2个分区。也就是说,整个消费组订阅了t0p0、t0p1、t1p0、t1p1、t2p0、t2p1、t3p0、t3pl这8个分区。最终的分配结果如下:
消货者n0:t0p0、t1p1、t3p0
消货者n1:t0p1、t2p0、t3p1
消货者n2:t1p0、t2p1

自定义分区分配策略

读者不仅可以任意选用Kafka提供的3种分配策略,还可以自定义分配策略来实现更多可选的功能。自定义的分配策略必须要实现org.apache.kafka.clients.consumer.intemnals.PartitionAssignor接口。

PartitionAssignor接口中定义了两个内部类:Subscription1和Assignmentc。

Subscription类用来表示消费者的订阅信息,类中有两个属性:topics和userDa ta分别表示消费者的订阅主题列表和用户自定义信息。PartitionAssignor接口通过subscription方来设置消费者自身相关的Subscription信息,注意到此方法中只有一个参数topics,与Subscription 类中的 topics的相呼应,但并没有体现有关userData的参数。为了增强用户对分配结果的控制,可以在subscriptionO方法内部添加一些影响分配的用户自定义信息赋子userData比如权重、IP地址、host或机架(rack)等。

总结

到这里能否存在不同消费者使用不同的分区分配策略?能否一个消费者设置两种分区分配策略?这两问题还没有结论,我们先直接给出答案——
这一切都是交由消费者协调器(ConsumerCoordinator)和组协调器
(GroupCoordinator)来完成的,它们之间使用一套组协调协议进行交互。在下一章节将继续讲解消费者协调器和组协调器,在这一章将详细说明kafka如何处理这两个问题。

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

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

相关文章

Flink CDC YAML:面向数据集成的 API 设计

摘要:本文整理自阿里云智能集团 、Flink PMC Member & Committer 徐榜江(雪尽)老师在 Flink Forward Asia 2024 数据集成(一)专场中的分享。主要分为以下四个方面: Flink CDC YAML API Transform A…

【截图】selenium自动通过浏览器截取指定元素div的图片

【截图】selenium自动通过浏览器截取指定元素div的图片 思路 截取完整网页截图 通过元素的坐标 截图到指定位置的图片 前提是已经获取到 driver 了 # 定位目标divtarget_div driver.find_element(By.CLASS_NAME, headlines-right)# 获取div的位置和大小location target_div…

gradio教程

Gradio 是一个开源的 Python 库,专为快速创建和共享机器学习模型和数据科学应用的交互式界面而设计。它简化了将复杂的机器学习模型转换为易于使用的 Web 应用程序的过程,使开发者能够轻松地与他人分享他们的工作成果。 主要特点: 简单易用&…

清理软件——软媒清理大师

随着电脑使用时间的增加,系统垃圾文件也会不断累积,导致C盘空间逐渐变得紧张。今天,我为大家推荐一款专业的清理软件——软媒清理大师,它能够高效地清理电脑中的无用垃圾文件,为您的电脑“减负”。 清理软件——软媒清…

【C++八股】 前置 ++i vs. 后置 i++ 的区别

在 C 中&#xff0c; 运算符有前置 i 和后置 i 两种方式&#xff0c;它们都能让变量自增 1&#xff0c;但在执行顺序、性能、应用场景上有所不同。 1. i vs. i 对比表 2. 代码示例 #include <iostream> int main() {int a 5, b 5;std::cout << "a "…

手动配置IP

手动配置IP&#xff0c;需要考虑四个配置项&#xff1a; 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址&#xff1a;格式表现为点分十进制&#xff0c;如192.168.254.1 子网掩码&#xff1a;用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…

PyTorch快速入门

Anaconda Anaconda 是一款面向科学计算的开源 Python 发行版本&#xff0c;它集成了众多科学计算所需的库、工具和环境管理系统&#xff0c;旨在简化包管理和部署&#xff0c;提升开发与研究效率。 核心组件&#xff1a; Conda&#xff1a;这是 Anaconda 自带的包和环境管理…

DeepSeek部署的一些问题

问题1&#xff1a;为什么不直接使用网页版的deepseek&#xff1f; 如果我们的需求是绝对的隐私保护和个性化的知识库的构建&#xff0c;就需要本地部署。试想一下&#xff0c;如果我们希望通过大模型能根据我们自己独有的文档来回答问题&#xff0c;那我们就需要把文件或附件上…

解决 Sentinel 控制台无法显示 OpenFeign 资源的问题

前言 在使用 Spring Cloud Alibaba Sentinel 进行微服务治理时&#xff0c;可能会遇到 Sentinel 控制台无法显示 OpenFeign 资源的问题。本文将详细分析问题的原因&#xff0c;并提供解决方案。 一、问题描述 在 Sentinel 控制台 1.8.8 版本中&#xff0c;簇点链路&#xff…

(done) openMP学习 (Day14: 总结)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 新手并行程序员与专家并行程序员之间的区别是专家have a collection…

深度求索与DeepSeek-R1:探索人工智能的新纪元

深度求索与DeepSeek-R1&#xff1a;探索人工智能的新纪元 引言 在当今快速发展的科技领域&#xff0c;尤其是人工智能&#xff08;AI&#xff09;方面&#xff0c;每隔一段时间就会出现一款革命性的产品或技术&#xff0c;彻底改变我们对这一领域的认知。2025年初&#xff0c…

pytest-xdist 进行多进程并发测试

在自动化测试中&#xff0c;运行时间过长往往是令人头疼的问题。你是否遇到过执行 Pytest 测试用例时&#xff0c;整个测试流程缓慢得让人抓狂&#xff1f;别担心&#xff0c;pytest-xdist 正是解决这一问题的利器&#xff01;它支持多进程并发执行&#xff0c;能够显著加快测试…

hadoop之MapReduce:片和块

假如我现在500M这样的数据&#xff0c;如何存储&#xff1f; 500M 128M 128M 128M 116M 分为四个块进行存储。 计算的时候&#xff0c;是按照片儿计算的&#xff0c;而不是块儿。 块是物理概念&#xff0c;一个块就是128M ,妥妥的&#xff0c;毋庸置疑。 片是逻辑概念&…

车载诊断工具技巧 --- CAPL Debug 功能使用介绍

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

windows蓝牙驱动开发-调试及支持的HCI和事件

调试蓝牙配置文件驱动程序 开发蓝牙配置文件驱动程序时&#xff0c;可以使用驱动程序验证程序来协助其调试。 若要启用验证检查&#xff0c;必须为 Bthusb.sys 启用驱动程序验证程序。 如果不执行此操作&#xff0c;将禁用验证检查。 若要完全利用验证检查&#xff0c;请确保…

【OneAPI】通过网页预渲染让搜索引擎收录网页

API简介 网页预渲染&#xff0c;适用于动态网页以及单页面的SEO&#xff0c;支持网页缓存。 您无须更改代码即可让搜索引擎收录您的网页。只要将需要预渲染的页面转发的本接口即可。 如果您使用Nginx作为网页服务器&#xff0c;推荐使用以下配置&#xff1a; #您的网站locat…

四、OSG学习笔记-基础图元

前一章节&#xff1a; 三、OSG学习笔记-应用基础-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145514021 代码&#xff1a;CuiQingCheng/OsgStudy - Gitee.com 一、绘制盒子模型 下面一个简单的 demo #include<windows.h> #include<osg/Node&…

springboot中使用注解实现分布式锁

下面将详细介绍如何在 Spring Boot 里借助注解实现分布式锁&#xff0c;以login_lock:作为锁的 key 前缀&#xff0c;使用请求参数里的phone值作为 key&#xff0c;等待时间设为 0 秒&#xff0c;锁的持续时间为 10 秒。我们会使用 Redis 来实现分布式锁&#xff0c;同时借助 S…

UART通信详解基于IMX6ULL实现

目录 2.1串口连接 2.2工作原理||数据通讯格式 2.2.1起始位 2.2.2数据位 2.2.3奇偶校验位 2.2.4停止位 2.2.5协议层 2.2.6波特率 2.2.7数据校验 2.3传输步骤 2.4IMX6ULL驱动开发-基于UART框架发送/接收串口数据 2.4.1在设备树中添加uart3子节点 2.4.2编写串口测试程…

Java运行时数据区

JVM主要流程包括三部分&#xff1a; 首先是 ClassLoard 类加载器&#xff0c;加载数据源文件到jvm当中然后将加载好的数据存放在运行时数据区最后由引擎进行解释和编译的工作 1.Java 内存区域&#xff1a; 1.1 程序计数器 程序计数器&#xff08;Program Counter Register&a…