参考文章:

Kafka Consumer Group和Consumer Rebalance机制

Kafka Consumer Group和Consumer Rebalance机制 - 简书

在新建一个Consumer时,我们可以通过指定groupId来将其添加进一个Consumer Group中。Consumer Group是为了实现多个Consumer能够并行的消费一个Topic,并且一个partition只能被一个Consumer Group里的一个固定的Consumer消费

1. Consumer Rebalance

对于一个Consumer Group,可能随时都有Consumer加入或者退出这个Consumer Group,Consumer列表的变化势必会引起partition的重新分配,这个为Consumer分配partition的过程就被称为Consumer Rebalance。

出现任何以下的场景都会触发Consumer Rebalance操作:

  • 有新的消费者加入Consumer Group。
  • 有消费者主动退出Consumer Group。
  • Consumer Group订阅的任何一个Topic出现分区数量的变化
  • ......

默认情况下,Kafka提供了两种分配策略:Range和RoundRobin。

1.1 Range策略

range策略的具体步骤如下:

  1. 对一个topic中的partition进行排序
  2. 对消费者按字典进行排序
  3. 然后遍历排序后的partition的方式分配给消费者

举个例子,比如有两个消费者C0和C1,两个topic(t0,t1),每个topic有三个分区p(0-2),
那么采用Range策略,分配出的结果为:

C0: [t0p0, t0p1, t1p0, t1p1]
C1: [t0p2, t1p2]

1.2 RoundRobin策略

RoundRobin策略和Range策略类型,唯一的区别就是Range策略分配partition时,是按照topic逐次划分的。而RoundRobin策略则是将所有topic的所有分区一起排序,然后遍历partition分给消费者。

因此,采用RoundRobin策略,分配出的结果为:

C0: [t0p0, t0p2, t1p1]
C1: [t0p1, t1p0, t1p2]

2. Group Coordinator

Group Coordinator主要负责Consumer Group的管理,Offset位移管理以及Consumer Rebalance。其中, Consumer Group管理方面,当一个Consumer希望加入某一个Consumer Group时,它会发送一个请求给Group Coordinator。Group Coordinator负责维护一个Consumer Group中所有的Consumer列表,随着Consumer的加入和退出,Coordinator也会随之更新这个列表。

Group Coordinator是运行在Kafka集群中每一个Broker内的一个进程。
主要负责Consumer Group的管理,Offset位移管理以及Consumer Rebalance。
对于每一个Consumer Group,Group Coordinator都会存储以下信息:

订阅的topics列表
Consumer Group配置信息,包括session timeout等
组中每个Consumer的元数据。包括主机名,consumer id
每个Group正在消费的topic partition的当前offsets
Partition的ownership元数据,包括consumer消费的partitions映射关系

第一个加入Consumer Group的Consumer被称为leader。

一旦Consumer Group中的成员发生变化,例如有新的Consumer加入,那么就需要为其分配partition;或者有Consumer退出,那么就需要将其负责消费的partition分配给组内其他成员。因此Consumer Group中的成员发生变化, Group Coordinator就负责发起Consumer Rebalance活动。

值得注意的是:

 真正的Consumer Rebalance行为是由Consumer Group Leader执行的。Group Leader首先向Coordinator获取Group中的Consumer成员列表,然后根据Rebalance策略,将partition分配给Consumer Group中的成员,再将分配结果告知Coordinator。最后,Coordinator将partition分配结果通知给每一个Consumer。在Consumer Rebalance的过程中,所有的Consumer都不允许消费消息。

Producer发送消息到Topic时,分配partition的算法如下:

  1. 如果指定了一个partition,那么直接使用指定的partition
  2. 如果没有指定partition,但是指定了key,那么会根据key进行哈希,分配到对应的partition中
  3. 如果partition和key都没指定,会使用round-robin算法进行分配

总结

  1. Consumer Groups 用于多个Consumer并行消费消息。为了防止两个消费者重复消费一条消息,Kafka不允许同一个Consumer Group中的两个Consumer读取同一个partition。
  2. Group Coordinator 用于维护Consumer Group信息。
  3. Consumer Rebalance 是为Consumer Group中的Consumer分配partition的过程。一旦一个Consumer Group中的成员发生变化,就会触发Rebalance行为。
  4. Group leader 是第一个加入Consumer Group的Consumer,它负责Consumer Rebalance的执行。
  5. Consumer Rebalance策略主要有Range和Round Robin。

Kafka Consumer Group和Consumer Rebalance机制相关推荐

  1. 聊聊 Kafka: Consumer 源码解析之 Rebalance 机制

    一.前言 我们上一篇分析了 Consumer 如何加入 Consumer Group,其实上一篇是一个很宏观的东西,主要讲 ConsumerCoordinator 怎么与 GroupCoordinat ...

  2. Kafka(Go)教程(十一)---Consumer Group Rebalance

    来自:指月 https://www.lixueduan.com 原文:https://www.lixueduan.com/post/kafka/11-consumer-group-rebalance/ ...

  3. .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(一)

    我们知道Kafka支持Consumer Group的功能,但是最近在应用Consumer Group时发现了一个Topic 的Partition不能100%覆盖的问题. 程序部署后,发现Kafka在p ...

  4. kafka Java客户端之consumer 流量控制 以及 Rebalance解析

    Consumer 流量控制 为了避免Kafka中的流量剧增导致过大的流量打到Consumer端将Consumer给压垮的情况,我们就需要针对Consumer进行限流.例如,当处理的数据量达到某个阈值时 ...

  5. 消费者组 Consumer Group 和 重平衡 Rebalance

    kafka设计了consumer group: 具有可扩展性和容错性的consumer机制,consumer group有3个特性: 1. Consumer Group 下可以有一个或多个 Consu ...

  6. .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(二)

    依据Partition和Consumer的Rebalance策略,找到Kafka.Client Rebalance代码块,还原本地环境,跟踪调试,发现自定义Consumer Group 的Consum ...

  7. Kafka系列4-基本概念及消费者组(Consumer Group)的理解

    几个基本概念: Kafka是一个分布式流数据系统,使用Zookeeper进行集群的管理.与其他消息系统类似,整个系统由生产者.Broker Server和消费者三部分组成,生产者和消费者由开发人员编写 ...

  8. kafka consumer、partition、rebalance

    发送消息分配partition Producer发送消息到Topic时,分配partition的算法如下: 如果指定了一个partition,那么直接使用指定的partition 如果没有指定part ...

  9. 【Kafka】Kafka的Rebalance机制可能造成的影响及解决方案

    一.kafka的rebalance机制 在Kafka中,当有新消费者加入或者订阅的Topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个 ...

最新文章

  1. Buck开关电源拓扑结构分析
  2. 马哥教育第二十二天IO模型理论、数据库基础理论、LAMP平台理论基础及mysql部署...
  3. linux之setsid命令
  4. jmeter之录制控制器与代理的使用
  5. Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)
  6. mybatis 批量提交清除缓存_重学Mybatis(三)-------缓存 (含面试题)
  7. linux内核mtd分区,嵌入式Linux MTD分区调整(MX28)
  8. 对linux下loop设备的理解。
  9. Mac平台使用SnapMotion从视频中提取图像
  10. Java菜鸡的学习日常——2021华为软挑(练手)
  11. EDA课程设计(设计一个4时隙的时分复用模块)(岭)
  12. zotero导出PDF
  13. Rust use of undeclared crate or module和maybe a missing crate?
  14. 2017中国云计算评测报告 1
  15. 社区o2o怎么做线上推广?
  16. ensp查看历史配置命令_华为路由查看配置命令是什么?
  17. Python基础知识-pycharm版-02
  18. 数据库字段类型CHAR和INT
  19. wap.php区别,WAP與PHP程序設計之基礎篇
  20. 搭建Gitea和Drone环境

热门文章

  1. 在幻方追寻热爱,在「萤火」定义极限
  2. js格式化时间格式年月日(yyyy-MM-dd)
  3. webgl限制帧率_webgl优化
  4. WebGL 图像处理技术
  5. 文本框(TextBox)根据行数多少来自动显示/隐藏滚动条
  6. 最全的 PyInputPlus 模块方法总结
  7. java/php/net/python汽车租赁网系统设计
  8. 面向对象在思维不在语言之C 语言多态实现例子
  9. Spring 依赖注入详解
  10. 获取本地ipv4和ipv6信息