消费者分区分配规则及其分配策略

本文解析Kafka的三种分配策略:RangeAssignor(范围分配)、RoundRobinAssignor(轮询分配)和Stricky(粘性分配)。重点介绍各自的工作原理、配置、优缺点及适用场景,帮助理解如何优化消费者分区分配以提高效率和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

分区分配规则
分配策略
RangeAssignor(范围分配)
RoundRobinAssignor(轮询分配)
Stricky(粘性分配)
分区分配规则
一个分区只能有一个消费者,
一个消费者可以有多个分区。

分区分配规则

一个分区只能有一个消费者,
一个消费者可以有多个分区。

分配策略

RangeAssignor(范围分配)

概述
RangeAssignor是Kafka默认的分配策略,它可以确保每个消费者消费的分区数量是均衡的。

配置
partition.assignment.strategy = org.apache.kafka.clients.consumer.RangeAssignor

分配公式
n = 分区数量 / 消费者数量
m = 分区数量 % 消费者数量
前m个消费者消费n+1个
剩余消费者消费n个
在这里插入图片描述
优缺点

使用场景
消费比较少的Topic,或者多个Topic都能均分

RoundRobinAssignor(轮询分配)
概述
RoundRobinAssignor轮询策略是将消费组内所有消费者以及消费者所订阅的所有topic的partition按照字典序排序(topic和分区的hashcode进行排序),然后通过轮询方式逐个将分区以此分配给每个消费者。

配置
partition.assignment.strategy = org.apache.kafka.clients.consumer.RoundRobinAssignor
在这里插入图片描述

优缺点
适用场景
所有消费者消费的Topic都是一致的(每个Topic中的分区数相等),能实现将所有分区轮询分配给所有消费者

Stricky(粘性分配)

概述
从Kafka 0.11.x开始,引入此类分配策略。主要目的:
1.分区分配尽可能均匀
2.在发生rebalance的时候,分区的分配尽可能与上一次分配保持相同

没有发生rebalance时,Striky粘性分配策略和RoundRobin(轮询)分配策略类似。
在这里插入图片描述

上面如果consumer2崩溃了,此时需要进行rebalance。如果是Range分配和轮询分配都会重新进行分配,例如:

通过上图,我们发现,consumer0和consumer1原来消费的分区大多发生了改变。接下来我们再来看下粘性分配策略。
在这里插入图片描述
之前consumer0、consumer1之前正在消费某几个分区,但由于rebalance发生,导致consumer0、consumer1需要重新消费之前正在处理的分区,导致不必要的系统开销。(例如:某个事务正在进行就必须要取消了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值