首页 > 其他分享 >消费者组重平衡全流程及状态机解析

消费者组重平衡全流程及状态机解析

时间:2023-06-12 12:55:18浏览次数:31  
标签:组重 消费者 领导者 成员 协调者 状态机 平衡 解析 请求

一、重平衡流程介绍

      消费者组重平衡的作用就是让消费者组达成一致,完成消费者与哪些主题分区达成一致。重平衡需要借助Kafka broker端的协调者组件,在coordinator的帮助下完成整个消费者分组的分区重分配。

触发与通知

  重平衡触发的3个条件

  • 消费者组的成员数量变化
  • 消费者组的主题数量发生变化
  • 消费者组的主题分区数发生变化

    其中第一个引起的消费者组重平衡的问题最为常见,即每次有消费者加入或离开消费者组时都会引起重平衡的问题。那么重平衡过程是如何通知到其他消费者实例的呢?答案就是重平衡的心跳机制就是靠消费者端的心跳线程来完成的。

    当协调者准备开始新一轮的重平衡时,它会将RELANCE_IN_PROGRESS分装进心跳请求当中,发送给消费者实例,当消费者实例发现心跳响应中有REBLANCE_IN_PROGRESS时就立马知道重平衡要开始了。

二、消费者组状态机

     重平衡一旦开始,broker端的协调者组件就要开始帮忙了,主要涉及到控制消费者组的状态流转,当前kafka设计了一个状态机的机制,来协助完成整个重平衡的流程。

1、kafka消费者组的5中状态

    kafka为消费者组定义了5中状态,他们分别是,Empty,Dead,PrepareingRebalce,CompletingRebance,Stable,这5种状态的含义:

 

      了解了这些状态图后,再看一下状态的流转图:

 

    这里详细记录一下消费者组启动时的状态流转过程,当一个应用的消费者组未启动时,此时的状态时Empty。当应用启动后,消费者组会通过协调者去确认它订阅的主题信息,协调者告诉所有的消费者加入rebanlace过程,此时消费者组的所有消费者都会加入,最先响应加入的消费者为领导者消费者(leader consumer),它会自己分配一套分区绑定消费方案然后告诉协调者,协调者在分发给所有的消费者,此时处于Preparing状态,当所有消费者完成信息统一分配后为Completing状态,所有消费者绑定主题分区,开始消费后为Stable状态。

  当有新成员加入或已有成员退出时,消费者组的状态从 Stable 直接跳到 PreparingRebalance 状态,此时,所有现存成员就必须重新申请加入组。当所有成员都退出组后,消费者组状态变更为 Empty。Kafka 定期自动删除过期位移的条件就是,组要处于 Empty 状态。只有 Empty 状态下的组,才会执行过期位移删除的操作。

消费者端重平衡流程

  有了上面的内容作铺垫,我们就可以开始介绍重平衡流程了。重平衡的完整流程需要消费者端和协调者组件共同参与才能完成。我们先从消费者的视角来审视一下重平衡的流程。

  在消费者端,重平衡分为2个步骤,分别是加入组和等待领导者组消费者分配分区方案,这2个步骤对应的请求分别是joingroup和syncgroup请求。

        当组内成员加入组时,他会向协调者发送JoinGroup请求。在该请求中,每个成员都要将自己订阅的主题上报,这样协调者就可以收集到所有组员的订阅信息。一旦收集了全部成员的JoinGroup请求后,协调者会从这些成员中选择一个担任这个消费者组的领导者。

  通常情况下,第一个发送JoinGroup请求的成员自动成为领导者。这里的消费者领导者和领导者副本不是一个概念。这里的领导者是具体的消费者实例,它既不是副本也不是协调者。领导者消费者的任务是收集所有成员的订阅信息,然后根据这些信息,指定具体的分区消费分配方案。

  选出领导者后,协调者会把消费者组的订阅信息分装进JoinGroup请求的的响应体中,然后发给领导者,由领导者统一做出分配方案后,进入下一步:发送SyncGroup请求。

  在这一步中,领导者向协调者发送SyncGroup请求,将刚刚分配出的分区方案发给协调者,同时其他的消费者也会向SyncGroup请求,只不过请求体中并没有什么具体的内容,这一步的目的是让协调者接收分配方案,然后统一以SyncGroup响应的方式分发给所有成员,这样组内的所有成员就知道自己该消费分区了

 

    就像之前说的,JoinGroup请求就是为了让所有的消费者将其所订阅的主题等消息发给领导者,待领导者制定好分区方案后,重平衡流程进入到SyncGroup阶段。

SyncGroup 请求的处理流程

  SyncGroup 请求的主要目的,就是让协调者把领导者制定的分配方案下发给各个组内成员。当所有成员都成功接收到分配方案后,消费者组进入到 Stable 状态,即开始正常的消费工作。到这里,消费者端的重平衡流程已经结束了。接下来,我们从协调者端来看一下重平衡是怎么执行的。

Broker 端重平衡场景剖析

标签:组重,消费者,领导者,成员,协调者,状态机,平衡,解析,请求
From: https://www.cnblogs.com/wushaoyu/p/14975320.html

相关文章

  • 业财一体化:供应链业务到财务核算的全貌解析
    编辑导语:在供应链的范畴里,从供应链的进销存业务开始,到财务的核算结束,才算是一个完整的物流、信息流和资金流。本文为大家详细介绍了供应链业务到财务核算的全貌,一起看看吧!因为财务的内容比较多,本篇文章,我们先介绍供应链的财务处理全貌,后面找机会再来展开介绍应收、应付和存货相关内......
  • 数据中心产业链深度解析
    国务院印发“十四五”数字经济发展规划。规划提出,推进云网协同和算网融合发展。加快构建算力、算法、数据、应用资源协同的全国一体化大数据中心体系。数据中心行业是数字经济的“基础底座”。在当前数字经济发展需求和政策红利的双重作用下,近年来国内市场规模持续扩张,2020年中国数......
  • 解析快捷方式指向的路径
    简介在做垃圾文件清理的时候,会涉及到快捷方式的解析,以确定其是否有效工作原理操作系统提供了解析快捷方式的API,其中新型的msi快捷方式,多见于Office的程序,其文件路径是类似msi:xxxx的ID信息,可以使用MsiGetShortcutTarget进行解析。普通的快捷方式,可以使用IShellLink来进......
  • 刷脸支付的奥秘解析
    一、刷脸支付简介刷脸支付目前比较流行的是支付宝或微信刷脸支付,支付宝是蜻蜓系列,微信是青蛙系列,但是你们知道他们采用的是什么技术么?二、刷脸支付技术分析首先无论是微信还是支付宝都发布了第二代的新产品,基于3D结构光技术实现对人活体进行识别,结构光三维成像的硬件主要由相机和投......
  • Spring事件监听机制使用和原理解析
    你好,我是刘牌!前言好久没有更新Spring了,今天来分享一下Spring的事件监听机制,之前分享过一篇Spring监听机制的使用,今天从原理上进行解析,Spring的监听机制基于观察者模式,就是就是我们所说的发布订阅模式,这种模式可以在一定程度上实现代码的解耦,如果想要实现系统层面的解耦,那么消息......
  • Java常用的几种JSON解析工具
    一、Gson:Google开源的JSON解析库1.添加依赖<!--gson--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency><!--lombok--><dependency><groupId>org.proje......
  • IP地址解析DNS
    IP地址解析DNS背景指定IP解析域名,查看解析的域名,常用作CDN地址解析查询是否生效。本文章给出几个解决方案的shell脚本#!/bin/bash##****************************************************************************************#Author:wei#**************......
  • Goland 包导入正常,但是无法解析函数和成员属性,编译不报错
    这段时间Goland突然出现了一个毛病,每次goget依赖后,虽然依赖拉下来了,但是代码里使用了这个module的地方无法引用出他的成员和属性,大片的标红,都提示「Unresolvedreference'xxxxx'」,但是只要把项目关了,重新打开,再次触发module的index索引动作,就恢复正常了。本来想看看有没......
  • Python 解析配置模块之ConfigParser详解
      yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子:defaddlist(alist):foriinalist:yieldi+1取出alist的每一项,然后把i+1塞进去。然后通过......
  • 【Linux的高级应用编程】TCP/IP网络编程函数解析
    TCP/IP网络编程函数解析 Sailor_forever socket(建立一个socket通信)相关函数accept,bind,connect,listen表头文件#include<sys/types.h>#include<sys/socket.h>定义函数intsocket(intdomain,inttype,intprotocol);函数说明socket()用来建立一个新的socket,也就是向系统注......