kafka系列文章四(Consumer Group)
前言
简单来讲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)相关推荐
- .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(二)
依据Partition和Consumer的Rebalance策略,找到Kafka.Client Rebalance代码块,还原本地环境,跟踪调试,发现自定义Consumer Group 的Consum ...
- C# 强化系列文章四:匿名方法的使用
C#强化系列文章四:匿名方法的使用 匿名方法 相信很多人都听过,它是C#2.0的一个新特性,顾名思义,匿名方法就是没有名称的方法.那么在C#中的匿名方法有哪些好处,在C#中如何使用呢? 匿名方法最明显 ...
- Spring Boot 2.0系列文章(四):Spring Boot 2.0 源码阅读环境搭建
前提 前几天面试的时候,被问过 Spring Boot 的自动配置源码怎么实现的,没看过源码的我只能投降��了. 这不,赶紧来补补了,所以才有了这篇文章的出现,Spring Boot 2. 0 源码阅 ...
- .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(一)
我们知道Kafka支持Consumer Group的功能,但是最近在应用Consumer Group时发现了一个Topic 的Partition不能100%覆盖的问题. 程序部署后,发现Kafka在p ...
- kafka系列文章索引
2019独角兽企业重金招聘Python工程师标准>>> apache kafka在数据处理中特别是日志和消息的处理上会有很多出色的表现,这里写个索引,关于kafka的文章暂时就更新到 ...
- 【kafka】Kafka 1.1.0 consumer group位移重设
1.概述 转载: https://www.cnblogs.com/huxi2b/p/7284767.html 本文阐述如何使用Kafka自带的kafka-consumer-groups.sh脚本随意设 ...
- Kafka(Go)教程(十一)---Consumer Group Rebalance
来自:指月 https://www.lixueduan.com 原文:https://www.lixueduan.com/post/kafka/11-consumer-group-rebalance/ ...
- cnn系列文章四 --池化层和简单卷积网络示例
cnn系列文章三 --padding和strides详解 一句歌词继续中: <霜雪千年> 苔绿青石板街 斑驳了流水般岁月 小酌三盏两杯 理不清缠绕的情结 典型的卷积神经网络 convolu ...
- 【Kafka】消费者组 Consumer Group(三)
文章目录 一.概念 二.创建Topic 三.开启3个Consumer的消费者组Group (分区数量1 < 消费者数量3) 3.1 结论一:一个分区Partition只能被一个消费者抢占.(组内 ...
- Kafka系列2-producer和consumer报错
使用127.0.0.1启动生产和消费进程: 1)启动生产者进程: bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic ...
最新文章
- libc++abi.dylib: terminate_handler unexpectedly threw an exception
- 怎么判断日出时间早晚_珠海最全防堵攻略,知道这些上班时间或缩短半小时!有大数据分析!...
- 剑指offer 树的子结构
- Image Control
- java代码里出现中文乱码怎么解决
- Python:查找天气预报json接口的城市代码(A)
- 使用ESAPI 解决veracode 漏洞
- linux apache 查看mpm 配置方式,Apache Prefork、Worker和Event三种MPM详解
- 搜狗推送代码之搜狗百万蜘蛛实现
- [Java学习] 小型社交平台,能发帖、查看、评论、删除帖子等功能
- android查看当前手机中的进程
- LU分解完成利用节点电压法的简易电路求解程序(二)
- 把int转换为char把int转换为char
- 2022年武汉东湖新技术开发区知识产权专项资助补贴38项
- 银行本、异地,本、跨行存取款收费比较
- Linux 终极装机指南
- android studio 电量,Android Studio 导出Unity插件(剩余电量、信号强度)
- 使用js监听文件下载事件,解决导出excel文件名为.do的bug
- 怎样判断变频器功率模块好坏
- 朝鲜版Windows操作系统“红星”首次曝光(图)
热门文章
- 修改《植物大战僵尸》的游戏存档
- 【Linux】树莓派控制人体红外传感器
- 教你如何管理Linux进程和任务
- 项目验收测试是什么意思?项目检测具体流程有哪些?
- WebGL默认全屏显示
- [Idea] Add Abbreviation的使用
- mysql 检索结果排序方式_MySQL--排序检索数据(ORDER BY)
- 3701汉化包 axure r9_AXURE9最全的WEB设计元件库(分享版).rplib
- 谷仓的安保【DFS】
- Python3.8场景式编程学习与训练- 第1章 入门基础 Python学习方法论与学习资源