前言

简单来讲Kafka的Consumer Group是由多个Consumer实例共同组成的一个消费组,Consumer Group由一个Group ID来标识,该组内的所有Consumer共同协调来消费Topic下的所有分区,当然一个Consumer实例只能够消费一个分区。


所以最为理想的情况下当你的Consumer Group下的Consumer实例个数和你的Topic分区个数相同时,那么每个Consumer都能消费一个分区的数据。但如果你的Consumer个数比分区数还多的话,比如: 3个Consumer实例,Topic中只有两个分区,那么总有一个Consumer实例处于空闲状态,那么的话就太浪费了

Offset

在Kafka中有一个专门的术语Offset用来记录Consumer在消费过程中的位移。而对于Consumer Group来说,它是用一组键值对来记录,key= groupId+topic+分区编号,value=Consumer针对该分区的位移量,在新版本的Kafka中该键值对由Kafka内部维护(老版本的存储在zookeeper中)

Rebalance

Rebalance(重平衡)规定了一个 consumer group 是如何达成一致来分配订阅 topic 的所有分区的,说简单点就是让组内的所有Consumer实例来均匀的订阅分区


如上图所示,一共有三种类型的场景会导致Kafka Reblance的发生

1.所订阅的Topic分区数发生变化,比如说Topic1新增了一个分区3,那么会导致订阅该Topic的所有Consumer Group发生Rebalance
2.Consumer Group中的Consumer实例个数发生变化,比如说新增Consumer实例或者某个Consumer实例因故障被剔除Consumer Group(减少Consumer实例)也会导致Rebalance
3.订阅的Topic数量发生变更,一般这种场景是Consumer Group使用了正则表达式来匹配Topic,此时如果你新增的Topic满足该表达式的要求的话,那么就会导致Reblance的产生

当发生Rebalance时,Consumer Group下的所有Consumer实例都需要参与Rebalance。Kafka
提供了三种分区分配策略来进行Rebalance(Consumer Group中的Consumer选择Topic中的那个分区),下文会详细描述这三种策略

Rebalance 策略

range

该策略的原理是按照Consumer个数和分区个数整除得出一个数量(每个消费者分配多少个分区)。由于考虑到会有余数的产生,所以总有几个消费者是比其他的要多出一个分区的,这里给出计算公式:

假设
a = 分区数/消费者数,
b(余数)= 分区数%消费者数,
那么我们可以很明显的知道前b个消费者每个消费者分配a+1个分区,
而后面的消费者则分配a个分区,下图描述了这一细节

round robin

该策略的实现方式比较简单,就是将分区按照字典序排序,然后遍历这些分区将分区逐一分配到每个Consumer中

sticky

该策略是Kafka从0.11才支持的分配策略,该策略在保证分配均匀的同时还要求这次的分配尽量和之前的相同。这么做的目的很明确,Consumer和Kafka之间是通过TCP进行连接,如果把连接都断开然后分配完成后重新建立连接,那么无故就会增多TCP的4次挥手(断联)和3次握手(建联)

总结

上述文章我们描述了Consumer Group发生Rebalance的原因,以及Rebalance的三种策略。
很明显「sticky」策略是最理想的策略,不过对于你的Kafka版本有要求(0.11 及以后的版本)。
另外当Consumer Group 发生Rebalance时,JVM(kafka由scala编写,最终会编译成.class文件交由java虚拟机)会STW(stop the world),当发生STW时,Consumer会等待Rebalance完成后才继续消费,所以我们要尽可能的避免Rebalance的产生。那么如何尽量的减少Rebalance的产生呢?

  • 业务上避免
    1.在创建Topic时尽量估算好分区数,后期非必要不要变动
    2.尽量少用正则表达式来订阅Topic,以免产生意向不到的效果

  • 运维上避免
    1.Consomer未及时发送心跳导致Rebalance

这里有两个参数需要你注意下
sesstion.timeout.ms : 一次session的连接超时时间
heartbeat.interval.ms: 发送心跳的间隔时间,建议设置成session连接超时时间的1/3

2.Consumer因消费超时导致Rebalance

这里同样有两个参数
max.poll.interval.ms: Consumer 间隔多长时间拉取消息
max.poll.records: Consumer 一次拉取的消息条数
这里给出的建议是:结合自身的业务特点,尽可能的在max.poll.interval.ms周期内消费完 max.poll.records

kafka系列文章四(Consumer Group)相关推荐

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

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

  2. C# 强化系列文章四:匿名方法的使用

    C#强化系列文章四:匿名方法的使用 匿名方法 相信很多人都听过,它是C#2.0的一个新特性,顾名思义,匿名方法就是没有名称的方法.那么在C#中的匿名方法有哪些好处,在C#中如何使用呢? 匿名方法最明显 ...

  3. Spring Boot 2.0系列文章(四):Spring Boot 2.0 源码阅读环境搭建

    前提 前几天面试的时候,被问过 Spring Boot 的自动配置源码怎么实现的,没看过源码的我只能投降��了. 这不,赶紧来补补了,所以才有了这篇文章的出现,Spring Boot 2. 0 源码阅 ...

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

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

  5. kafka系列文章索引

    2019独角兽企业重金招聘Python工程师标准>>> apache kafka在数据处理中特别是日志和消息的处理上会有很多出色的表现,这里写个索引,关于kafka的文章暂时就更新到 ...

  6. 【kafka】Kafka 1.1.0 consumer group位移重设

    1.概述 转载: https://www.cnblogs.com/huxi2b/p/7284767.html 本文阐述如何使用Kafka自带的kafka-consumer-groups.sh脚本随意设 ...

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

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

  8. cnn系列文章四 --池化层和简单卷积网络示例

    cnn系列文章三 --padding和strides详解 一句歌词继续中: <霜雪千年> 苔绿青石板街 斑驳了流水般岁月 小酌三盏两杯 理不清缠绕的情结 典型的卷积神经网络 convolu ...

  9. 【Kafka】消费者组 Consumer Group(三)

    文章目录 一.概念 二.创建Topic 三.开启3个Consumer的消费者组Group (分区数量1 < 消费者数量3) 3.1 结论一:一个分区Partition只能被一个消费者抢占.(组内 ...

  10. Kafka系列2-producer和consumer报错

    使用127.0.0.1启动生产和消费进程: 1)启动生产者进程: bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic ...

最新文章

  1. libc++abi.dylib: terminate_handler unexpectedly threw an exception
  2. 怎么判断日出时间早晚_珠海最全防堵攻略,知道这些上班时间或缩短半小时!有大数据分析!...
  3. 剑指offer 树的子结构
  4. Image Control
  5. java代码里出现中文乱码怎么解决
  6. Python:查找天气预报json接口的城市代码(A)
  7. 使用ESAPI 解决veracode 漏洞
  8. linux apache 查看mpm 配置方式,Apache Prefork、Worker和Event三种MPM详解
  9. 搜狗推送代码之搜狗百万蜘蛛实现
  10. [Java学习] 小型社交平台,能发帖、查看、评论、删除帖子等功能
  11. android查看当前手机中的进程
  12. LU分解完成利用节点电压法的简易电路求解程序(二)
  13. 把int转换为char把int转换为char
  14. 2022年武汉东湖新技术开发区知识产权专项资助补贴38项
  15. 银行本、异地,本、跨行存取款收费比较
  16. Linux 终极装机指南
  17. android studio 电量,Android Studio 导出Unity插件(剩余电量、信号强度)
  18. 使用js监听文件下载事件,解决导出excel文件名为.do的bug
  19. 怎样判断变频器功率模块好坏
  20. 朝鲜版Windows操作系统“红星”首次曝光(图)

热门文章

  1. 修改《植物大战僵尸》的游戏存档
  2. 【Linux】树莓派控制人体红外传感器
  3. 教你如何管理Linux进程和任务
  4. 项目验收测试是什么意思?项目检测具体流程有哪些?
  5. WebGL默认全屏显示
  6. [Idea] Add Abbreviation的使用
  7. mysql 检索结果排序方式_MySQL--排序检索数据(ORDER BY)
  8. 3701汉化包 axure r9_AXURE9最全的WEB设计元件库(分享版).rplib
  9. 谷仓的安保【DFS】
  10. Python3.8场景式编程学习与训练- 第1章 入门基础 Python学习方法论与学习资源