Kafka扩分区和分区副本重分配之后消费组会自动均衡吗?
2023-09-11 14:17:07 时间
作者:石臻臻, CSDN博客之星Top5、Kafka Contributor 、nacos Contributor、华为云 MVP ,腾讯云TVP, 滴滴Kafka技术专家 、 KnowStreaming PMC)。
Know Streaming 是滴滴开源的Kafka运维管控平台, 有兴趣一起参与参与开发的同学,但是怕自己能力不够的同学,可以联系我,带你一起你参与开源! 。
KnowStreaming 体验环境请访问:https://demo.knowstreaming.com/
最近有个靓仔问我, 扩分区之后 消费组会不会重新平衡呢?
那我们今天从源码的角度来一起分析一下, 扩分区能否重平衡?
问题
Kafka扩分区 或者 分区副本重分配之后 是否会自动重新平衡?
源码探究
ConsumerCoordinator#rejoinNeededOrPending
@Override
public boolean rejoinNeededOrPending() {
if (!subscriptions.hasAutoAssignedPartitions())
return false;
// we need to rejoin if we performed the assignment and metadata has changed;
// also for those owned-but-no-longer-existed partitions we should drop them as lost
// 如果订阅的Topic元信息有过变更,则需要重新发起joinGroup请求
if (assignmentSnapshot != null && !assignmentSnapshot.matches(metadataSnapshot)) {
log.info("Requesting to re-join the group and trigger rebalance since the assignment metadata has changed from {} to {}",
assignmentSnapshot, metadataSnapshot);
requestRejoin();
return true;
}
// we need to join if our subscription has changed since the last join
//如果我们的订阅自上次加入以来发生了变化,我们需要重新发起请求 JoinGroup
if (joinedSubscription != null && !joinedSubscription.equals(subscriptions.subscription())) {
log.info("Requesting to re-join the group and trigger rebalance since the subscription has changed from {} to {}",
joinedSubscription, subscriptions.subscription());
requestRejoin();
return true;
}
return super.rejoinNeededOrPending();
}
这段代码就是用于判断是否能够重新发起JoinGroup请求的逻辑。
主要有以下两点:
- 如果订阅的Topic元信息有过变更,则需要重新发起joinGroup请求
- 如果我们的订阅自上次加入以来发生了变化,我们需要重新发起请求 JoinGroup
所以很好理解
-
如果我们扩分区了或者分区副本重分配了, 那么就属于Topic的元信息有过变更了。这里的判定逻辑及时True。需要重平衡
-
如果我们订阅的Topic有变更(新增删除)了,那么也需要重平衡
当然这个接口触发时机是 KafkaConsumer.poll
结论
消费者客户端在Poll数据进行消费的时候,会先去判断是否需要进行重平衡。
判断条件是:如果订阅的Topic元信息有变更,或者订阅的Topic有增删,都需要进行重平衡之后再去Poll数据。
而分区副本重分配和 扩分区 因为属于变更了订阅的Topic元信息, 则需要重平衡
相关文章
- kafka安装配置
- 来吧,1分钟带你玩转Kafka
- Kafka简明教程
- Kafka序列化和反序列化与示例
- Apache Kafka + Spark Streaming Integration
- 使用命令进行Apache Kafka操作
- Windows平台整合SpringBoot+KAFKA_第1部分_环境配置部分
- go中简单使用kafka
- 阿里云上部署kafka--遇到的坑
- 【网址收藏】k8s中部署kafka-eagle
- golang操作kafka
- kafka-eagle报错解决:Kafka version is “-“ or JMX Port is “-1“ maybe kafka broker jmxport disable.
- KAFKA EAGLE 监控MRS kafka之操作实践
- 一文了解kafka消息队列,实现kafka的生产者(Producer)和消费者(Consumer)的代码,消息的持久化和消息的同步发送和异步发送
- 全网最详细地理解Kafka中的Topic和Partition以及关于kafka的消息分发、服务端如何消费指定分区、kafka的分区分配策略(range策略和RoundRobin策略)
- Kafka消费组(consumer group)
- 【云原生 | Kubernetes 系列】---Kafka 集群安装配置手册
- zookeeper+kafka集群安装之中的一个
- pyspark kafka createDirectStream和createStream 区别
- Linux安装Kafka
- Kafka 主题管理
- Kafka 消费者组
- Kafka 消费进度