首页 > 其他分享 >kafka入门(九):kafka分区分配策略

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

时间:2024-01-20 19:44:32浏览次数:30  
标签:订阅 消费者 分区 入门 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:核心设计与实践原理》

标签:订阅,消费者,分区,入门,kafka,分配,策略
From: https://www.cnblogs.com/expiator/p/17977029

相关文章

  • 云计算-nacos入门以及生产配置举例
    生产上nacos配置使用简单举例,相关敏感信息已经去除nacos以ds的方式部署在华为云CCE的容器当中,后台微服务,sprintboot中写明nacos的依赖,dockerfile打包到镜像仓库,在CCE运行容器的时候,读取CCE中configmap获取配置项参数。好处是可以标准集中管理发布,适合变更发布运维详细请参考官方文......
  • 【C++入门到精通】 C++入门—命名空间
    前言    前面我们学习了C语言,并且知道了C语言的基础语法与用途。接下来一段时间我们会再来学习一下基于C语言并且根据C语言改造的一门新的语言—C++     硕硕相信只要各位大佬们跟着我的博客看下去,肯定能有不少的收获。二话不说咱们要开车了,坐稳扶好呦C++的发展历......
  • kafka使用(I)
    Kafka遇到一些问题offset在rebalanceFetchpositionFetchPosition{offset=143266,offsetEpoch=Optional[2],currentLeader=LeaderAndEpoch{leader=Optional[52.159.97.203:9092(id:1rack:null)],epoch=absent}}isoutofrangeforpartitiontcp_link-0,resettingof......
  • HTML入门
    #HTML入门HTML基础超文本标记语言(HyperTextMarkupLanguage,简称:HTML)是一种用于创建网页的标准标记语言。HTML-----用来描述网页的一种语言```<head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"......
  • ClickHouse入门
    简介:ClickHouse是俄罗斯Yandex公司使用C++语言编写开源的列式存储数据库,主要用于在线分析查询(OLAP),使用SQL查询实时生成分析数据报告。一、安装 二、入门1. 特点A.列式存储:较MySQL行式存储有利于列的聚合、计数等操作,针对每列可选择最优的数据压缩算法来压缩......
  • 洛谷入门赛 #19 题解
    比赛传送门A-分饼干I将三盒饼干按数量排序。若较小的两盒饼干数之和大于另一盒饼干,则将较小的两盒饼干奖励给第一名,另一盒奖励给第二名;若较大的一盒饼干数大于另外两盒之和,则将较大的一盒奖励给第一名,另外两盒奖励给第二名。B-分饼干II每个人分到的饼干数都不同,即可以看......
  • 【LGR-172-Div.4】洛谷入门赛 #19 题解
    比赛链接:\(link\)T1分饼干I题目描述洛谷网校举行了期末考试,同学们经过课程的学习,考出了优异的成绩。Z在考试中获得了第一名,yz在考试中获得了第二名,老师决定买一些饼干奖励两名小朋友。老师买了三盒饼干,第一盒有\(a\)块饼干,第二盒有\(b\)块饼干,第三盒有\(c\)块饼干......
  • archlinux调整分区及btrfs文件系统大小
    1.防止数据丢失有重要数据要先备份最好现在虚拟机练习一下,2.注意点修改分区的初始位置似乎需要删除分区后重建分区,意味着分区数据全被删除。所以修改分区初始位置可能需要其它办法修改分区的初始位置风险有点大,可能是因为分区初始位置存储着分区表参照:https://superuser.co......
  • 中间件 ZK分布式专题与Dubbo微服务入门 4-15 acl的常用使用场景
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12711 1重点关注1.1zk集群,主从节点,心跳机制(选举模式) 选举模式介绍1xx主节点(主人),yy和zz从节点(奴隶)2xx主节点挂掉了,yy和zz竞争当主人,结果zz成功上位,zz是主节点,yy是从节......
  • 最大异或和 可持久化数据结构入门
    最大异或和题目描述给定一个非负整数序列\(\{a\}\),初始长度为\(N\)。有\(M\)个操作,有以下两种操作类型:Ax:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N\)加\(1\)。Qlrx:询问操作,你需要找到一个位置\(p\),满足\(l\lep\ler\),使得:\(a[p]\oplusa[p+1]......