kafka Consumer Group
注:本文主要参考极客时间专栏 Kafka核心技术与实战
1.Consumer Group
作用:
Consumer Group 是kafka提供的可扩展且具有容错性的机制。
Consumer Group 图解如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y4HhRbNW-1598233269215)(/Users/zy1994/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/f0086e12acc701547372ff7de576ded8/Message/MessageTemp/9e20f478899dc29eb19741386f9343c8/Image/2861589533106_.pic_hd.jpg)]
Concumer group 也存在比分区多或者少的情况,多的话会导致多余的consumer Instance 分配不到分区,应该尽量避免。少的话,会导致某一个instance分配多个分区,具体根据自己的业务进行处理。
Consumer Group:实现不同的消息模型:
- 发布订阅模型
- 多个Consumer Group订阅一个Topic
- 点对点模型
- 一个Consumer Group 订阅一个Topic
kafka对Consumer Group 的分区策略 会尽可能的保证每个实例上的分区数比较均衡。
2.offset
2.1.commit offset 存储变迁
commit offset 的定义就是当前consumer 消费对应分区消息的位置。
0.8.2.x之前 0.8.2.x之后
zookeeper >>>>>>>>> kafka内部主题(Internal Topic)
zookeeper:
- 优势
- Broker端不需要存储数据,无状态,更容易使用高伸缩性。
- 减少了Broker需要持有的位移空间。
- 劣势
- zookeeper 并不适合做大量的写操作,效率比较低
internal Topic:
- 优势
- Kafka的Topic 天然支持高可用和高频的写操作。
- 劣势
- Broker 不再是无状态的。
2.2.内部主题基本信息
Topic名称:_consumer_offset
2.2.1消息格式:
(1).普通消息:
- key
- 通过这个key可以路由到一个具体的Consumer Group 下的一个Consumer Instance
- value
- offset(主要内容记录消费位移)
- 时间戳 (为了方便kafka 对位移主题消息的操作,最主要的就是位移清理操作)
- 用户自定义数据
(2).保存Consumer Group 的消息 (用来注册Consumer Group)
(3)删除Consumer Group offset 信息甚至是删除Group的消息格式(tombstone消息)
2.2.2消息创建时间以及如何分配
第一个Consumer程序启动的时候,会自动创建内部主题。
#内部主题的分区数 默认是50
offsets.topic.num.partitions:
#内部主题的副本数 默认是3
offsets.topic.replication.factor:
在kafka集群中还没有consumer 启动的时候可以手动创建内部主题指定分区数和副本数,但是最好还是交给kafka自己创建,因为存在手动创建存在很多的bug。
2.2.3内部主题如何提交位移:
Consumer端参数:
#开启手动提交
enable.auto.commit = false
#开启自动提交
enable.auto.commit = true
#自动提交的时间间隔
auto.commit.interval.ms
- 手动提交
- 使用正确的提交api 保证消息不重复消费和不丢失。
- 自动提交
- 优点
- 不用用户自己提交方便
- 能够保证消息不回丢失
- 缺点
- 灵活性可控性不强,丧失了对Consumer的管理
- 只要consumer 在启动着,就会一直向Coordinator主动提交唯一,可能会导致不必要的位移提交操作。
- 优点
2.2.4.内部位移主题如何获取位移
通过Consumer Group 的groupId 找到对应的分区的Leader所在的Broker,就是Coordinator所在的broker 去获取对应的信息。
2.2.5.内部主题定时清理
compaction: 整理算法
保证每个key的最新时间的位移。
Kafka 提供了专门的后台线程定期地巡检待 Compact 的主题,看看是否存在满足条件的可删除数据。这个后台线程叫 Log Cleaner。
如果线上存在位移主题无限膨胀的问题,建议去查看这个线程是否挂了。
3.Rebalance
Coordinator Consumer Group 进行位移主题操作的协调器
每一个Broker上都有一个Coordinator
Consumer Group 路由到对应的Coordinator上
1.根据GroupId计算出partitionId
partitionId = Math.abs(groupId.hashCode() % offsetsTopicPartitionCount)
2.找到partitionId对应的Leader所在的Broker 就是当前Consumer Group 需要的Coordinator
3.1Rebalance触发的时机:
- 小组成员发生变化
- 订阅主题数发生变化
- 主题分区数发生变化
3.2Rebalance的劣势
- 影响Consumer 端的TPS,Rebalance期间,整个Consumer Group 的Consumer Intance 都不在提