kafka设计了consumer group: 具有可扩展性和容错性的consumer机制,consumer group有3个特性:

1. Consumer Group 下可以有一个或多个 Consumer 实例。
2. Consumer Group有唯一标识Group ID,它是一个字符串。
3. Consumer Group 下所有consumer订阅的主题的单个分区,但是只能分配给组内的某一个 Consumer消费。

如果只有1个group,那么就是点对点(消息队列)模型;如果有多个group,那么就实现了发布/订阅模型。

一般情况下,一个Group 下的consumer实例个数 应该等于该group订阅topic的分区总数

那么,每个consumer实例负责哪个或者哪些分区呢?这里提个概念 Rebalance

Rebalance是分配一致性协议,规定了所有的consumer如何达成共识,怎么去分配订阅topic的每个分区。

当group内consumer实例数发生变化、订阅的topic数发生变化、订阅的topic分区数发生变化,都会触发重平衡Rebalance。

心跳线程

每个消费者端都有个心跳线程(heartbeat thread),用来告知Coordinator组件’我还活着‘。

重平衡Rebalance的通知机制是通过心跳线程来完成的。当协调者决定开启新一轮重平衡后,它会将“REBALANCE_IN_PROGRESS”封装进消费者心跳请求的响应中,发还给消费者实例,来通知消费者要进行重平衡过程了。

kafka设计了消费者组状态机来协调完成整个Rebalance过程。

消费者组有5中状态:

Empty,Dead,Preparing Rebalance(加入组),Completing Rebalance(等待leader consumer的分配方案), Stable(完成)

Rebalance的缺点是:

1. 在Rebalance过程中,所有的consumer实例都要停止消费,有点像jvm的垃圾回执机制stop the world。

2. 一旦Rebalance,所有的consumer实例都要重新分配分区,那么实例连接在broker上tcp连接要断开然后重连。

希望社区能参考‘一致性哈希’算法,尽量减少全局的变动。

所以,尽量避免重平衡Rebalance的发生,

比如:

1. Broker端Coordinator组件没有收到group下的某consumer实例的心跳,则认为它挂了,默认是heartbeat.interval.ms = 10s检测一次,可以多设置几轮心跳请求,session.timeout.ms >= n * heartbeat.interval.ms ; n比如是3. 当超过session.timeout.ms时,该consumer实例就被剔除了。如果是consumer主动关闭,则第一时间会Rebalance。

2. 如果Consumer消费端处理业务逻辑的时间过长,或者max.poll.interval.ms设置的太小,或者max.poll.records设置的太大,这3种情况也可能会触发Rebalance。总之,consumer实例poll一次后(poll拉取消息前会自动提交offset到__consumer_offsets中,当时间间隔超过了设置的max.poll.interval.ms值,下一次调用poll方法还迟迟未发生时,consumer group会开启Rebalance,并且把将要提交offset的分区分配给了另一个consumer实例,原consumer实例遗憾的被踢出了。如果是手动提交时(enable.auto.commit = false),当下一次poll时,会触发CommitFailedException异常,说明了本次提交offset失败。悲剧的是,另一个consumer并不知道offset提交失败,从而导致了重复消费问题。

顺便提下位移 Offset。 consumer group怎么管理offset呢,用一组KV对, K是分区,V是消费该分区的offset。

以前,consumer group的位移数据是放在Zookeeper中,后来发现这会降低zookeeper集群的性能。

现在,consumer group将位移数据保存在broker端的内部主题中,

即把位移数据作为普通的kafka消息,提交到位移主题(__consumer_offsets)中,

__consumer_offsets的主要作用就是:保存Kafka消费者的位移信息

设计上,__consumer_offsets的key是: consumer group id + topic + partition

__consumer_offsets是kafka自动创建的,默认分区数是50,副本数是3。

注意:下面说的‘位移’指的是consumer端的位移,记录了consumer要消费的下一条消息的位移。

consumer端默认是自动提交位移,即enable.auto.commit = true, 配合auto.commit.interval.ms定期间隔时间提交位移,缺点是:消费太快时,可能写入的位移前一次是10,该次是15? 如果没有消息可消费时,会定期一直写入10,直到有新消息可消费。

推荐采用手动提交offset,即enable.auto.commit = false。有2种提交机制:consumer.commitSync()(同步,缺点是有阻塞),或者commitAsync()(异步,缺点是出错了不能自动重试),一般是两者结合一起用(如下图)。

代码:

那么随着时间越长,位移主题占用的磁盘空间越大,kafka后台线程Log Cleaner会定期的删除过期数据。

消费者组 Consumer Group 和 重平衡 Rebalance相关推荐

  1. 消费者组consumer group详解-Kafka从入门到精通(九)

    上篇文章说了,kafka可以通过实现partitioner自定义分区,producer拦截器,拦截器是在producer发送消息之后,回调之前调用,里面主要重写两个方法,一个是onSend,可以重新定 ...

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

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

  3. kafka 主动消费_Kafka消费组(consumer group)

    在开始之前,我想花一点时间先来明确一些概念和术语,这会极大地方便我们下面的讨论.另外请原谅这文章有点长,毕竟要讨论的东西很多,虽然已然删除了很多太过细节的东西. 一. 误区澄清与概念明确 1 Kafk ...

  4. Kafka设计解析(十三)Kafka消费组(consumer group)

    转载自 huxihx,原文链接 Kafka消费组(consumer group) 一直以来都想写一点关于kafka consumer的东西,特别是关于新版consumer的中文资料很少.最近Kafka ...

  5. Kafka消费组(consumer group)(转)

    转载自:http://www.cnblogs.com/huxi2b/p/6223228.html 一直以来都想写一点关于kafka consumer的东西,特别是关于新版consumer的中文资料很少 ...

  6. kafka 分组消费topic_Kafka消费组(consumer group)(转)

    在开始之前,我想花一点时间先来明确一些概念和术语,这会极大地方便我们下面的讨论.另外请原谅这文章有点长,毕竟要讨论的东西很多,虽然已然删除了很多太过细节的东西. 一. 误区澄清与概念明确 1 Kafk ...

  7. Kafka消费组(consumer group)

    原文出处:https://www.cnblogs.com/huxi2b/p/6223228.html 转载请注明出处. ---------------------------------------- ...

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

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

  9. 大名鼎鼎又臭名昭著的消费组和重平衡

    点击上方蓝色"胖滚猪学编程",选择"设为星标" 跟着胖滚猪学编程!好玩!有趣! 摘要:Consumer Group 指多个消费者实例组成一个组来共同消费一组主题 ...

最新文章

  1. mysql join order by_MySQL 14 慢查询优化join、order by、group by
  2. 自定义TabHost,TabWidget样式 .
  3. 20行以内python代码画出各种减压图
  4. eclipse(或者myeclipse)常用配置方法
  5. SAP Analytics Cloud里的Planning model
  6. java文件传输之文件编码和File类的使用
  7. 豆瓣再被约谈处罚150万!一年被罚20次,豆瓣到底怎么了?
  8. 自考那些事儿(六):计算机网络原理(总述篇)
  9. configure: error: Please reinstall the libcurl distribution - easy.h should be ……
  10. 2022N1叉车司机国家题库及答案
  11. google 常用的技术搜索关键词
  12. DES算法的加解密原理(详细算法+样例Demo)
  13. 【备忘】大数据最火爆技术spark之王家林2016最新高清视频教程
  14. 问题 E: LZY去年买了个表
  15. linux根据端口限速,Linux 中限制网络带宽使用trickle或wondershaper
  16. h3c r4900服务器系统安装,H3C R4900 G3安装CentOS 6.7网卡配置方法
  17. OpenCV-Python图形图像处理专栏文章目录
  18. EPR测试与生物医学应用
  19. Codecombat, 寓教于乐
  20. (前端学习)寒假第四周周报

热门文章

  1. 全球首次,我国科学家攻克世界级难题,证实量子金属态存在
  2. 同等学力--申硕报考(在职研究生)
  3. MarkDown+Hbuilder学习总结
  4. 让其他的App唤起自己的App——Allowing OtherApps to Start Your Activity
  5. Windows+Ubuntu 20.04.3 双系统详细教程【含镜像文件和所需工具】
  6. 内存详解mdash;mdash;理解 JVM 如何使用 AIX 上的本机内存
  7. 订单和订单明细继承等级结构简单介绍
  8. 笔记本外接显示器开hdr后黑屏无法操控
  9. 《第五元素》女高音的歌曲
  10. Android 指纹识别