前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kafka重平衡机制

Kafka重平衡机制

作者头像
张乘辉
发布于 2019-09-30 02:34:16
发布于 2019-09-30 02:34:16
1.3K0
举报
文章被收录于专栏:后端进阶后端进阶
当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配分区再进行消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。

重平衡的作用

重平衡跟消费组紧密相关,它保证了消费组成员分配分区可以做到公平分配,也是消费组模型的实现,消费组模型如下:

从图中可以找到消费组模型的几个概念:

1.同一个消费组,一个分区只能被一个消费者订阅消费,但一个消费者可订阅多个分区,也即是每条消息只会被同一个消费组的某一个消费者消费,确保不会被重复消费;2.一个分区可被不同消费组订阅,这里有种特殊情况,加入每个消费组只有一个消费者,这样分区就会广播到所有消费者上,实现广播模式消费。

要想实现以上消费组模型,那么就要实现当外部环境变化时,比如主题新增了分区,消费组有新成员加入等情况,实现动态调整以维持以上模型,那么这个工作就会交给 Kafka 重平衡机制去处理。

Kafka与RocketMQ的重平衡区别

Kafka 重平衡机制的一些实现相比 RocketMQ 还是有些区别的,但最终的目的还是都是一样,就是保证分区(RocketMQ 是队列)公平分配且只能被一个消费者订阅(同一个消费组)。

Kafka 重平衡:

从图中可看出,Kafka 重平衡是外部触发导致的,触发 Kafka 重平衡的有以下几种情况:

1.消费组成员发生变更,有新消费者加入或者离开,或者有消费者崩溃;2.消费组订阅的主题数量发生变更;3.消费组订阅的分区数发生变更。

每个消费者都会跟 Coordinator 保持心跳,当以上情况发生时,心跳响应就会包含 REBALANCE_IN_PROGRESS 命令,消费者停止消费,加入到重平衡事件当中。

RocketMQ重平衡:

RocketMQ 消费者启动时,会开启两条线程,一条线程执行拉取消息任务,另一条线程者则定时执行重平衡任务,从图中可看出拉取消息线程会从 pullRequestQueue 中取出拉取任务,pullRequestQueue 是一个阻塞队列,意味着当 pullRequestQueue 队列中元素为空时,会一直阻塞,直到有新的拉取任务,那么如果添加新的任务到阻塞队列中去呢?这时 RocketMQ 的重平衡作用就来了,它会每隔 20s 从任意一个 Broker 节点获取消费组的消费 ID 以及订阅信息,再根据这些订阅信息进行分配,然后将分配到的信息封装成 pullRequest 对象 pull 到 pullRequestQueue 队列中,拉取线程唤醒后执行拉取任务。

重平衡所涉及的参数

在消费者启动时,某些参数会影响重平衡机制的发生,所以需要根据业务的属性,对这些参数进行调优,否则可能会因为设置不当导致频繁重平衡,严重影响消费速度,下面跟大家说说这几个参数的一些要点:

•session.timeout.ms

该参数是 Coordinator 检测消费者失败的时间,即在这段时间内客户端是否跟 Coordinator 保持心跳,如果该参数设置数值小,可以更早发现消费者崩溃的信息,从而更快地开启重平衡,避免消费滞后,但是这也会导致频繁重平衡,这要根据实际业务来衡量。

•max.poll.interval.ms

消费者处理消息逻辑的最大时间,对于某些业务来说,处理消息可能需要很长时间,比如需要 1分钟,那么该参数就需要设置成大于 1分钟的值,否则就会被 Coordinator 剔除消息组然后重平衡。

•heartbeat.interval.ms

该参数跟 session.timeout.ms 紧密关联,前面也说过,只要在 session.timeout.ms 时间内与 Coordinator 保持心跳,就不会被 Coordinator 剔除,那么心跳间隔的时间就是 session.timeout.ms,因此,该参数值必须小于 session.timeout.ms,以保持 session.timeout.ms 时间内有心跳。

下面我用图来形象表达这三个参数的含义:

重平衡流程

在新版本中,消费组的协调管理已经依赖于 Broker 端某个节点,该节点即是该消费组的 Coordinator, 并且每个消费组有且只有一个 Coordinator,它负责消费组内所有的事务协调,其中包括分区分配,重平衡触发,消费者离开与剔除等等,整个消费组都会被 Coordinator 管控着,在每个过程中,消费组都有一个状态,Kafka 为消费组定义了 5 个状态,如下:

1.Empty:消费组没有一个活跃的消费者;2.PreparingRebalance:消费组准备进行重平衡,此时的消费组可能已经接受了部分消费者加入组请求;3.AwaitingSync:全部消费者都已经加入组并且正在进行重平衡,各个消费者等待 Broker 分配分区方案;4.Stable:分区方案已经全部发送给消费者,消费者已经在正常消费;5.Dead:该消费组被 Coordinator 彻底废弃。

可以看出,重平衡发生在 PreparingRebalance 和 AwaitingSync 状态机中,重平衡主要包括以下两个步骤:

1.加入组(JoinGroup):当消费者心跳包响应 REBALANCE_IN_PROGRESS 时,说明消费组正在重平衡,此时消费者会停止消费,并且发送请求加入消费组;2.同步更新分配方案:当 Coordinator 收到所有组内成员的加入组请求后,会选出一个consumer Leader,然后让consumer Leader进行分配,分配完后会将分配方案放入SyncGroup请求中发送会Coordinator,Coordinator根据分配方案发送给每个消费者。

重平衡场景举例

根据重平衡触发的条件,重平衡的工作流程大概有以下几种类型:

有新的成员加入消费组:

消费组成员崩溃:

消费组成员主动离开:

消费组成员提交位移时:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kafka 重平衡 全流程解析
本文来自 极客时间 Kafka核心技术与实战 这段时间有看 极客时间的这个课程, 这里仅以分享的角度来做个笔记。 那么本文将涉及到以下几个知识点:
solve
2019/10/30
3.7K0
kafka消费组及重平衡的影响
消费组应该算是kafka中一个比较有特色的设计模式了,而他的重平衡机制也是我们在实际生产使用中,无法避免的一个问题。
一条老狗
2020/06/16
4K0
Ckafka消费者组反复重平衡问题解决之道
Ckafka 消费重平衡机制同开源kafka一样,就是让一个消费者组下所有的 Consumer 实例就如何消费订阅主题的所有分区达成共识的过程。在重平衡过程中,所有 Consumer 实例共同参与,在协调者组件的帮助下,完成订阅主题分区的分配。但是,在整个过程中,所有实例都不能消费任何消息,会影响到我们业务消息的正常消费。
邓愉悦
2020/10/21
3.8K0
线上Kafka突发rebalance异常,如何快速解决?
Kafka 是我们最常用的消息队列,它那几万、甚至几十万的处理速度让我们为之欣喜若狂。但是随着使用场景的增加,我们遇到的问题也越来越多,其中一个经常遇到的问题就是:rebalance(重平衡)问题。
陈树义
2020/05/22
6.6K1
线上Kafka突发rebalance异常,如何快速解决?
Kafka组消费之Rebalance机制
《Kafka重要知识点之消费组概念》讲到了kafka的消费组相关的概念,消费组有多个消费者,消费组在消费一个Topic的时候,kafka为了保证消息消费不重不漏,kafka将每个partition唯一性地分配给了消费者。但是如果某个消费组在消费的途中有消费者宕机或者有新的消费者加入的时候那么partition分配就是不公平的,可能导致某些消费者负载特别重,某些消费者又没有负载的情况。Kafka有一种专门的机制处理这种情况,这种机制称为Rebalance机制。
王知无-import_bigdata
2020/09/25
6.2K0
Kafka组消费之Rebalance机制
Kafka又出问题了!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2021/03/09
7810
【Kafka专栏 01】Rebalance漩涡:Kafka消费者如何避免Rebalance问题?
Kafka中的Rebalance是消费者组(Consumer Group)内部的一个重要机制,它指的是消费者实例之间重新分配Topic分区(Partition)的过程。在Kafka集群中,Rebalance是为了确保消费者组能够均匀地消费数据而设计的。然而,这个过程在某些场景下,如消费者实例的加入或离开、Topic或Partition数量的变化,甚至是网络波动,都可能导致不必要的触发。频繁的Rebalance会极大地增加消费者组的开销,影响整体的性能和稳定性。因此,本文将深入探讨和分析导致Rebalance的潜在原因,并提出一系列有效的优化策略,以帮助开发者和管理员避免不必要的Rebalance,从而提高Kafka消费者组的性能和可靠性。
夏之以寒
2024/06/05
1.8K0
面试必问之kafka
快递小哥手上有很多快递需要送,他每次都需要先电话一一确认收货人是否有空、哪个时间段有空,然后再确定好送货的方案。这样完全依赖收货人了!如果快递一多,快递小哥估计的忙疯了……如果有了便利店,快递小哥只需要将同一个小区的快递放在同一个便利店,然后通知收货人来取货就可以了,这时候快递小哥和收货人就实现了解耦!
一笠风雨任生平
2022/01/06
6020
面试必问之kafka
一文理解Kafka的选举机制与Rebalance机制
Kafka是一个高性能,高容错,多副本,可复制的分布式消息系统。在整个系统中,涉及到多处选举机制,被不少人搞混,这里总结一下,本篇文章大概会从三个方面来讲解。
全菜工程师小辉
2021/07/23
9K0
Kafka Consumer 消费消息和 Rebalance 机制
Kafka 有消费组的概念,每个消费者只能消费所分配到的分区的消息,每一个分区只能被一个消费组中的一个消费者所消费,所以同一个消费组中消费者的数量如果超过了分区的数量,将会出现有些消费者分配不到消费的分区。消费组与消费者关系如下图所示:
码哥字节
2024/03/20
5170
Kafka Consumer 消费消息和 Rebalance 机制
kafka知识点--offset管理和Consumer Rebalance
consumer group是kafka提供的可扩展且具有容错性的消费者机制。组内可以有多个消费者或消费者实例(consumer instance),它们共享一个公共的ID,即group ID。组内的所有消费者协调在一起来消费订阅主题(subscribed topics)的所有分区(partition)。 consumer group下可以有一个或多个consumer instance,consumer instance可以是一个进程,也可以是一个线程 group.id是一个字符串,唯一标识一个consumer group consumer group下订阅的topic下的每个分区只能分配给某个group下的一个consumer(当然该分区还可以被分配给其他group)
哲洛不闹
2020/03/11
4.9K0
Kafka - 3.x Kafka消费者不完全指北
这个工作流程涵盖了Kafka消费者从配置到数据处理再到资源管理的主要步骤。消费者通常是多线程或多进程的,以处理大量的消息,并能够根据需要调整消费速率。此外,Kafka的消费者库提供了很多功能,如自动负载均衡、自动偏移管理等,以简化消费者的开发和维护。
小小工匠
2023/10/31
5010
Kafka - 3.x Kafka消费者不完全指北
如何快速全面掌握Kafka?5000字吐血整理
Kafka 是目前主流的分布式消息引擎及流处理平台,经常用做企业的消息总线、实时数据管道,本文挑选了 Kafka 的几个核心话题,帮助大家快速掌握 Kafka,包括:
大数据技术架构
2020/03/13
2.7K0
如何快速全面掌握Kafka?5000字吐血整理
Kafka体系架构详细分解
我的个人博客排版更舒服: https://www.luozhiyun.com/archives/260
luozhiyun
2020/03/19
8650
kafka进阶-文末思维导图
session.timeout.ms >= 3* heartbeat.interval.ms 至少3轮的心跳请求。
温安适
2021/06/01
4050
Kafka-consumer与Topic分区及consumer处理超时「建议收藏」
消费者组:Consumer Group ,一个Topic的消息能被多个消费者组消费,但每个消费者组内的消费者只会消费topic的一部分
全栈程序员站长
2022/11/17
1.3K0
Kafka-consumer与Topic分区及consumer处理超时「建议收藏」
从一个消费慢的例子深入理解 kafka rebalance
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 ---- 文章来源:https://lxkaka.wang/kafka-rebalance/ 前 言 消息队列是服务端必不可少的组件,其中Kafka可以说是数一数二的选择,对于大部分服务端的同学来说Kafka也是最熟悉的消息中间件之一。而当我们在生产上遇到kafka的使用问题时想要透过现象看到问题的本质,从而找到解决问题的办法。这就要求对kafka的设计和实现有这较为深刻的认识。在这篇文章里我们就以生产实际的例子来展开讨论Kafka在消费
猿天地
2022/03/04
1.5K0
Kafka 核心组件之协调器
假设某 topic 有4个分区,消费者组中只有一个消费者,那么这个消费者将消费全部 partition 中的数据。
CoderJed
2018/09/13
3.1K0
Kafka 核心组件之协调器
Kafka中的再均衡
在《Kafka消费者的使用和原理》中已经提到过“再均衡”的概念,我们先回顾下,一个主题可以有多个分区,而订阅该主题的消费组中可以有多个消费者。每一个分区只能被消费组中的一个消费者消费,可认为每个分区的消费权只属于消费组中的一个消费者。但是世界是变化的,例如消费者会宕机,还有新的消费者会加入,而为了应对这些变化,让分区所属权的分配合理,这都需要对分区所属权进行调整,也就是所谓的“再均衡”。本文将对再均衡的相关知识进行详细叙述。
草捏子
2020/09/28
8840
Kafka中的再均衡
解密kafka为啥总是在重平衡
使用的是java SDK :kafka-clients:2.1.0, kafka版本:2.4.1
沐榕樰
2024/08/01
2250
相关推荐
Kafka 重平衡 全流程解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档