Kafka消费者组重平衡(一)

news2025/1/23 10:23:32

文章目录

    • 概述
    • 消费者组特点
    • 什么是 Coordinator
    • 重平衡影响

概述

重平衡,也就是Rebalance, 就是让一个 Consumer Group 下所有的 Consumer 实例就如何消费订阅主题的所有分区达成共识的过程。在 Rebalance 过程中,所有 Consumer 实例共同参与,在协调者组件的帮助下,完成订阅主题分区的分配。
Kafka消费者重平衡时一个很重要的概念,本文主要从什么是消费组,什么消费者组协调器,重平衡有哪些影响,又该如何降低重平衡这几方面来总结。

消费者组特点

从broker端读取消息的客户端,称为消费者;具有相同group.id的消费者,属于同一个消费组,即Consumer Group。概括就是:Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制

分区与消费者之间的对应关系,大致可以总结为以下几种:
在这里插入图片描述

  • Consumer Group 之间彼此独立,互不影响,它们能够订阅相同的一组主题而互不干涉
  • Consumer Group 下可以有一个或多个 Consumer 实例。这里的实例可以是一个单独的进程,也可以是同一进程下的线程。在实际场景中,使用进程更为常见
  • Group ID 是一个字符串,在一个 Kafka 集群中,它标识唯一的一个 Consumer Group
  • Consumer Group 下所有实例订阅的主题的单个分区,只能分配给组内的某个 Consumer 实例消费。

针对Consumer Group,Kafka是怎么管理位移的呢?

在kafka的位移这篇文章中,详细地介绍了Kafka对位移地管理,这里总结一下:

Consumer Group的位移存储主题中,__consumer_offsets这个主题中的消息格式为KV对,key为[Group, Topic, Partition],value可以简单理解为记录了偏移量;这样的记录方式,使得broker端不需要关心group下有多少个消费者,新增消费者或者减少消费者发生重平衡时,都能准确地定位到对应地分区应该从哪个位置开始消费。

什么是 Coordinator

协调者,在 Kafka 中对应的术语是 Coordinator,它专门为 Consumer Group 服务,负责为 Group 执行Rebalance 以及提供位移管理和组成员管理等。

Consumer 端应用程序在提交位移时,其实是向 Coordinator 所在的 Broker提交位移。同样地,当 Consumer 应用启动时,也是向 Coordinator 所在的 Broker 发送各种请求,然后由 Coordinator 负责执行消费者组的注册、成员管理记录等元数据管理操作。

Consumer Group 如何确定为它服务的Coordinator 在哪台 Broker 上呢?跟内部主题__consumer_offsets 有关。

Kafka 为某个 Consumer Group 确定 Coordinator 所在的 Broker 的算法有 2 个步骤。

第一步:确定该group的位移由__consumer_offsets 的哪个分区

partitionId=Math.abs(groupId.hashCode() % offsetsTopicPartitionCount)

第二步:找出partitionId对应的Leader副本所在的Broker,该Broker就是Coordinator

以上面的test-group为例,先计算出要提交的分区号

@Test
   void getCommitOffsetPartitionTest() {
       String groupId = "test-group";
       System.out.println(Math.abs(groupId.hashCode() % 50));
   }

上面运行结果是12,也就是,位移主题的分区 12 负责保存这个 Group 的数据。有了分区号,根据步骤2找出这个分区的Leader副本所在的Broker 上就可以了。这个 Broker,就是我们要找的 Coordinator

重平衡影响

重平衡,也就是Rebalance, 就是让一个 Consumer Group 下所有的 Consumer 实例就如何消费订阅主题的所有分区达成共识的过程。在 Rebalance 过程中,所有 Consumer 实例共同参与,在协调者组件的帮助下,完成订阅主题分区的分配。

在项目稳定运行的过程中,最好的能够避免进行重平衡,在重平衡的过程中,整个kafka集群是不能对外提供消息消费的,在消息高峰期必定引起消息堆积,影响吞吐量。总结下来,重平衡只要有以下2个方面的影响:

  1. Rebalance 影响 Consumer 端 TPS,在Rebalance期间,Consumer会停下手头的事情,什么也不干。
  2. Rebalance 很慢。Rebalance时,Group下所有成员都会参与进来,如果 Group 下成员很多,Rebalance过程会消耗很长时间,这个期间,消息不能被消费

那么应该如何避免重平衡呢?

Rebalance发生的时机,主要有3个

  • 组成员数量发生变化
  • 订阅主题数量发生变化
  • 订阅主题的分区数发生变化

在真实的业务场景中,大多是因为组成员的数量发生了变化引起Rebalance

当启动一个配置有相同 group.id 值的Consumer 程序时,就会向这个Group 添加了一个新的 Consumer 实例。Coordinator 会接纳这个新实例,将其加入到组中,并重新分配分区。通常来说,增加Consumer 实例的操作都是计划内的,比如为了增加TPS。这个Rebalance是意料之中的。

而我们要规避的是“不必要的Rebalance”,重点主要讨论这个。

三个重要的参数

当 Consumer Group 完成 Rebalance 之后,每个 Consumer 实例都会定期地向Coordinator 发送心跳请求,表明它还存活着。如果某个 Consumer 实例不能及时地发送心跳请求,Coordinator 就会认为该 Consumer 已经“死”了,从而将其从 Group中移除,然后开启新一轮 Rebalance。

session.timeout.ms : 默认值10s,如果 Coordinator 在 10 秒之内没有收到 Group 下某 Consumer 实例的心跳,它就会认为这个 Consumer 实例已经挂了。这个参数决定了Consumer 存活性的时间间隔。

heartbeat.interval.ms : 默认值3s,控制发送心跳请求频率的参数,每隔3s发送一次心跳。broker会在心跳请求的响应中返回是否需要开启重平衡。这个值设置得越小,Consumer 实例发送心跳请求的频率就越高。频繁地发送心跳请求会额外消耗带宽资源,但好处是能够更加快速地知晓当前是否开启Rebalance。

max.poll.interval.ms : Consumer 端应用程序两次调用 poll 方法的最大时间间隔。它的默认值是 5 分钟,表示你的 Consumer 程序如果在 5分钟之内无法消费完 poll 方法返回的消息,那么 Consumer 会主动发起“离开组”的请求,Coordinator 也会开启新一轮 Rebalance。

以个人经验,有两种常见的情况会出现Rebalance。

  1. Consumer服务器与Broker端出现网络通信波动或Consumer端出现了频繁的FullGC,这种情况都会导致心跳线程与Broker之间的通信
  2. Consumer端使用同步消费,poll下来的消息消费时间过长,也会引发Rebalance。

Rebalance是Kafka自我保护的机制,而出现Rebalance的两大诱因(消费者线程挂起、网络异常)都无法100%避免,那么我们就根据业务情况,合理的调优一下kafka的配置参数,从而减少rebalance出现的概率。

参数调整,可以参考阿里云文档:https://help.aliyun.com/document_detail/154454.html

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

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

相关文章

ShardingSphere分库分表(一):高性能架构模式

互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能。高性能数据库集群的第一种方式是“读写分离”,第二种方式是“数据库分片”。 文章目录 1、读写分离架…

地理测绘基础知识(6) 照射距离等值线计算

上一篇文章中,我们采用HPR坐标系里的向量旋转,在地表绘制了这样的螺旋线: 在复杂多样的现实应用需求中,还有一种更为普遍的计算需求,就是求取地表到全向光源的距离为D的所有点的集合(用多边形组成的近似椭…

MongoDB简介以及安装

文章目录 1. MongoDB简介2. NoSQL简介3. MongoDB安装 1. MongoDB简介 MongoDB是一种NoSQL数据库,采用了文档数据库模型。它以BSON(Binary JSON)格式存储数据,支持动态模式和灵活的查询语言。MongoDB具有以下特点: 文…

虚拟机 + Ubuntu22.04 + ros2 (humble) colcon build turtlebot3_node失败的解决方案

一、问题描述 在虚拟机Ubuntu22.04中安装了ROS2(humble),下载turtlebot3。在colcon build --symlink-install 编译的过程中turtlebot3_Fake_node一直失败,无法正常运行,影响后面的仿真测试。 二、解决方案 查阅相关资料后发现问…

JAVA 从入门到起飞 面向对象 day08 P2

老师的知识点1 在JAVA中,必须先设计类,才能获得对象。 我的理解: 疑问:为什么是这样的呢? 答案: 在 JAVA 或其他面向对象的编程语言中,类是对象的蓝图或模板。这意味着在你创建对象之前&am…

【已解决】在Win11上离线安装 .NET Framework 3.5的方法【含网盘离线文件】

随 Windows 11提供的是.NET Framework 4.8,该环境可以运行任何 .NET Framework 4.x 应用。 而.NET Framework 3.5 支持为 .NET Framework 2.0 到 3.5 生成的应用,需要自行安装。 当Win11的应用软件需要.net framework3.5的运行环境时,就会提…

领域驱动设计:微服务架构模型

文章目录 整洁架构六边形架构DDD 分层架构三种微服务架构模型的对比和分析从三种架构模型看中台和微服务设计 整洁架构 整洁架构又名“洋葱架构”。为什么叫它洋葱架构?整洁架构的层就像洋葱片一样,它体现了分层的设计思想。在整洁架构里,同…

跨站请求伪造

CSRF是什么? 跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击,攻击的重点在于更改状态的请求,而不是盗取数据&#x…

西部是真的地广人稀啊,常用地市东西分布差异明显

背景 最近在使用folium处理一些工作上的事情,这过程中发现一些GPS坐标数据的获取和置换不是太方便,尤其是坐标置换,做了一些工作进行了GPS坐标数据秘坐标置换方向的封装。 GPS坐标类封装的过程中,发现一些常用的GPS坐标的查取比…

安装程序报错“E: Sub-process /usr/bin/dpkg returned an error code (1)”的解决办法

今天在终端使用命令安装程序时出现了如下的报错信息。 E: Sub-process /usr/bin/dpkg returned an error code (1) 这种情况下安装什么程序最终都会报这个错,具体的报错截图如下图所示。 要解决这个问题,首先使用下面的命令进到相应的目录下。 cd /var/…

项目02—基于keepalived+mysqlrouter+gtid半同步复制的MySQL集群

文章目录 一.项目介绍1.拓扑图2.详细介绍 二.前期准备1.项目环境2.IP划分 三. 项目步骤1.ansible部署软件环境1.1 安装ansible环境1.2 建立免密通道1.3 ansible批量部署软件1.4 统一5台mysql服务器的数据 2.配置基于GTID的半同步主从复制2.1 在master上安装配置半同步的插件,再…

蓝桥杯官网练习题(玩具蛇)

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。 小蓝还有一个…

ROS学习笔记(五)---话题发布

1. 话题通信是什么 在ROS(机器人操作系统)中,话题通信是一种常用的通信机制,用于在不同的ROS节点之间传递消息。话题通信基于发布者-订阅者模式,其中一个节点(发布者)发布消息到一个特定的话题…

使用最新android sdk 将jar文件编译成dex

最近需要一些比较骚的操作,所以需要将gson编译成dex。 因为手上有jar包,所以就拿出了android sdk准备一把入魂,结果报错不断,让人无奈。只好根据报错来调整编译步骤,不得不为安卓环境更新Debug。 1、dx变d8 并不确定…

postgresql-通用表达式

postgresql-通用表达式 入门案例简单CTE递归 CTE案例1案例2 入门案例 -- 通用表达式 with t(n) as (select 2) select * from t;简单CTE WITH cte_name (col1, col2, ...) AS (cte_query_definition ) sql_statement;WITH 表示定义 CTE,因此 CTE 也称为 WITH 查询…

Pandas中at、iat函数详解

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 at 函数:通过行名和列名来取值(取行名为a, 列名为A的值) iat 函数:通过行号和列号来取值(取第1行,第1列的值) 本文给出at、iat常见的…

Mybatis-Plus-入门简介(2)

Mybatis-Plus-入门简介 1.简介 Mybatis-Plus官网:https://baomidou.com/ Mybatis-Plus仓库地址:https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter 仓库地址:仓库地址:https://gitee.com/long-xiaozhe…

932. 漂亮数组

932. 漂亮数组 原题链接:完成情况:解题思路:参考代码: 原题链接: 932. 漂亮数组 https://leetcode.cn/problems/beautiful-array/description/ 完成情况: 解题思路: nums 是由范围 [1, n] 的…

智慧公厕破解公共厕所管理的“孤岛现象”

在现代社会中,公共厕所是城市管理中的一项重要任务。然而,经常会出现公厕管理的“孤岛现象”,即每个公厕都是独立运作,缺乏统一的管理和监控机制。针对这一问题,智慧公厕的出现为解决公共厕所管理难题带来了新的方案。…

无涯教程-JavaScript - COUPNUM函数

描述 COUPNUM函数返回结算日和到期日之间应付的息票数量,四舍五入到最接近的整数。 语法 COUPNUM (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 Re…