kafka入门(九):kafka分区分配策略

kafka分区分配策略 参数:

Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。

默认情况下,此参数的值为 org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka还提供了另外两种分配策略:RoundRobinAssignor 和 StickyAssignor。

RangeAssignor 分配策略

RangeAssignor 分配策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者

对于每一个主题,RangeAssignor策略会将消费组内所有订阅这个主题的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区

假设n=分区数/消费者数量,m=分区数%消费者数量,那么前m个消费者每个分配n+1个分区,后面的(消费者数量-m)个消费者每个分配n个分区。前m个消费者,相当于是除不尽的余数,特殊分配多一个分区。

假设消费组内有2个消费者C0和C1,都订阅了主题t0和t1,并且每个主题都有3个分区,

那么订阅的所有分区可以标识为:t0p0、t0p1、t0p2、t1p0、t1p1、t1p2。

最终的分配结果为:

消费者c0: t0p0、t0p1、t1p0、t1p1

消费者c1: t0p2、t1p2

分区数为3,消费者数量为2,n=3/2 =1,m=3%2=1。前m个消费者每个分配n+1个分区,后面的(消费者数量-m)个消费者每个分配n个分区。

可以明显地看到这样的分配并不均匀,如果将类似的情形扩大,则有可能出现部分消费者过载的情况。

RoundRobinAssignor分配策略

RoundRobinAssignor分配策略的原理是将消费组内所有消费者及消费者订阅的所有主题的分区按照字典序排序,然后通过轮询方式逐个将分区依次分配给每个消费者

假设消费组内有3个消费者(C0、C1和C2),它们共订阅了3个主题(t0、t1、t2),这3个主题分别有1、2、3个分区,即整个消费组订阅了t0p0、t1p0、t1p1、t2p0、t2p1、t2p2这6个分区。

具体而言,消费者C0订阅的是主题t0,消费者C1订阅的是主题t0和t1,消费者C2订阅的是主题t0、t1和t2,

那么最终的分配结果为:

消费者c0: t0p0

消费者c1: t1p0

消费者c2: t1p1, t2p0,t2p1, t2p2

RoundRobinAssignor策略也不是十分完美,这样分配其实并不是最优解,因为完全可以将分区t1p1分配给消费者C1。

StickyAssignor 分配策略

主要有两个目的: (1)分区的分配要尽可能均匀。 (2)分区的分配尽可能与上次分配的保持相同。

如同其名称中的“sticky”一样,让分配策略具备一定的“黏性”,尽可能地让前后两次分配相同,进而减少系统资源的损耗及其他异常情况的发生。

如果发生分区重分配,那么对于同一个分区而言,有可能之前的消费者和新指派的消费者不是同一个,之前消费者进行到一半的处理还要在新指派的消费者中再次复现一遍,这显然很浪费系统资源。StickyAssignor 分配策略如同其名称中的“sticky”一样,让分配策略具备一定的“黏性”,尽可能地让前后两次分配相同,进而减少系统资源的损耗及其他异常情况的发生。

自定义分区分配策略

不仅可以任意选用Kafka提供的3种分配策略,还可以自定义分配策略来实现更多可选的功能。

自定义的分配策略必须要实现 org.apache.kafka.clients.consumer.internals.PartitionAssignor接口。

资料来源:

《深入理解Kafka:核心设计与实践原理》

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

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

相关文章

选择排序 | 冒泡排序 | C语言(详解)

一,选择排序 1,基本知识 对排序的双层 for 循环的理解:外层 控制趟数,里层 不断地对数组进行遍历。 2,逐层深入 经典的选择排序GIF动图,如下: 关键部分: Ⅰ,从数组中…

mathematical-expression 实现 数学表达式解析 Java 篇

mathematical-expression 实现 数学表达式解析 Java 篇 Java技术栏 使用 ME( mathematical-expression)数学表达式解析库 实现Java中 数学表达式 的解析和计算。 目录 文章目录 mathematical-expression 实现 数学表达式解析 Java 篇目录mathematical-…

面试知识点:notify是随机唤醒线程吗(唤醒线程顺序)?

做 Java 开发的小伙伴,对 wait 方法和 notify 方法应该都比较熟悉,这两个方法在线程通讯中使用的频率非常高,但对于 notify 方法的唤醒顺序,有很多小伙伴的理解都是错误的,有很多人会认为 notify 是随机唤醒的&#xf…

构建中国人自己的私人GPT—与文档对话

先看效果 他可以从上传的文件中提取内容作为答案。上传文件摄取速度 摄取速度取决于您正在摄取的文档数量以及每个文档的大小。为了加快摄取速度,您可以在配置中更改摄取模式。 存在以下摄取模式: simple:历史行为,一次按顺序摄…

超实用桌面助手!时间、日期、天气,一目了然!完全免费!

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒⚓️ 相关链接 ⚓️ 📖 介绍 📖 这是一款我根据自己的需求写的一个桌面小工具,自己一直在用,现在分享给需要的朋…

sysbench在mysql中的使用

sysbench安装 [rootgip ~]# yum install epel-release -y [rootgip ~]# yum install sysbench -y 查看sysbench的版本: [rootgip ~]# sysbench --version sysbench 1.1.0-df89d34 基于sysbench构造测试表和测试数据 sysbench --db-drivermysql --time5 --threads10…

纯前端实现了Excel文件转JSON和JSON转Excel下载

需求前提: 上传Excel文件,并将Excel文件的内容拿出来转换为JSON本地定义JSON数据,然后将它封装后转换为Excel文件下载 安装依赖 这两个功能是借助xlsx包实现的,所以需要先安装xlsx包: npm install xlxs依赖引用 i…

【Android Gradle 插件】Gradle 基础配置 ④ ( Gradle Wrapper 配置作用 | Gradle 下载的依赖库存放位置 )

一、Gradle Wrapper 配置作用 gradle wrapperdistributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-6.7.1-bin.zip zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/distsGradle Wrapper 配…

【云原生】Docker的安装和镜像操作

目录 什么是Docker? 容器化越来越受欢迎,因为容器是: Docker与虚拟机的区别: 容器在内核中支持2种重要技术: Docker核心概念: 安装Docker 安装依赖包 设置阿里云镜像源 安装 Docker-CE并设置为开机…

C++设计模式之迭代器模式

【声明】本题目来源于卡码网(https://kamacoder.com/) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是迭代器模式(第19种设计模式) 迭代器模式是⼀种行为设计模…

回顾一下容易被忽视golang基础的面试考察点

Golang里面 interface、指针、函数呢,是数据类型吗? 背景 string、int、bool、数组、切片 …等等,这些我们很快就会回答是数据类型,但 interface、指针、函数呢,是数据类型吗?这个时候我们可能就会有点犹豫…

simpleperf、Flame Graph使用简介

目录 背景 simpleperf简介 Simpleperf使用 将Simpleperf工具的可执行程序 push 到手机上 启动手机上的被测程序,ps 出该程序的进程ID 记录运行结果数据perf.data 报告结果数据:将data转为txt 将手机的文件pull到电脑指定路径 使用脚本report_ht…

nginx 解决tensorflow-serving 跨域代理问题

在nginx conf.d/目录下新建一个main.conf 配置该文件 进行代理 upstream rec{server 127.0.0.1:19356 ;keepalive 20000;}upstream rcv-module{server 10.0.2.198:8511 ;keepalive 20000;} server {listen 80;server_name **.**.com;#access_log /var/log/nginx/h…

docker-compose搭建redis集群

这里用docker-compose在一台机器搭建三主三从,生产环境肯定是在多台机器搭建,否则一旦这台宿主机挂了,redis集群全挂了,依然是单点故障。同时,受机器性能极限影响,其并发也上不去,算不上高并发。…

2024年深圳市软件产业高质量发展应用推广体系扶持计划人工智能软件应用示范项目申请指

​一、资助的项目类别 企业实施的通过应用人工智能软件对现有生产、服务和管理方式进行智能化升级,且技术水平先进、市场前景广阔、带动效应明显的人工智能软件应用示范项目。 二、设定依据 (一)《深圳市人民政府关于印发推动软件产业高质…

web开发学习笔记(14.mybatis基于xml配置)

1.基本介绍 2.基本使用 在mapper中定义 在xml中定义&#xff0c;id为方法名&#xff0c;resultType为实体类的路径 在测试类中写 3. 动态sql&#xff0c;if和where关键字 动态sql添加<where>关键字可以自动产生where和过滤and或者or关键字 where关键字可以动态生成whe…

go-carbon v2.3.6 发布,轻量级、语义化、对开发者友好的 golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库&#xff0c;支持链式调用。 目前已被 awesome-go 收录&#xff0c;如果您觉得不错&#xff0c;请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…

kafka(一)快速入门

一、kafka&#xff08;一&#xff09;是什么&#xff1f; kafka是一个分布式、支持分区、多副本&#xff0c;基于zookeeper协调的分布式消息系统&#xff1b; 二、应用场景 日志收集&#xff1a;一个公司可以用Kafka收集各种服务的log&#xff0c;通过kafka推送到各种存储系统…

Zabbix 整合 Prometheus:案例分享与操作指南

一、简介 Zabbix 和 Prometheus 都是流行的开源监控工具&#xff0c;它们各自具有独特的优势。Zabbix 主要用于网络和系统监控&#xff0c;而 Prometheus 则专注于开源的分布式时间序列数据库。在某些场景下&#xff0c;将这两个工具整合在一起可以更好地发挥它们的优势&#…

vue3源码(二)reactiveeffect

一.reactive与effect功能 reactive方法会将对象变成proxy对象&#xff0c; effect中使用reactive对象时会进行依赖收集&#xff0c;稍后属性变化时会重新执行effect函数。 <div id"app"></div><script type"module">import {reactive,…