From 15 消费者组到底是什么?

Consumer Offset 保存位置:

  • 老版本的 Consumer Group 把位移保存在 ZooKeeper 中,减少 Broker 端的状态保存开销,做成无状态的,方便扩缩。
  • 由于 ZooKeeper 这类元框架不适合频繁的写操作,而 Consumer Offset 是频繁更新的写操作,会拖慢 ZooKeeper 集群性能。最终将其保存在内部主题 __consumer_offsets
  • Kafka 采用 hash(consumerGroupId) % __consumer_offsets 主题的分区数来计算我们的偏移量提交到哪一个分区。因为偏移量也是保存到主题中的,所以保存的过程和生产者生产数据的过程基本相同。

From 16 揭开神秘的“位移主题”面纱

__consumer_offsets —— 记录消费端 offset,属于 Kafka 的内部主题。可以创建、修改、删除,但是消息格式是 Kafka 固定住的。

三种信息:
消费主体的 Key:消费者组 ID + Topic + 分区编号构成,Value 可以简化为位移值。
用于保存 Consumer Group 信息的消息
用于删除 Group 过期位移甚至是删除 Group 的消息

__consumer_offsets 的分区数目:Broker 端参数 offsets.topic.num.partitions,默认 50;
__consumer_offsets 的副本数目:offsets.topic.replication.factor,默认 3。

也可以在创建 Consumer 之前,先创建 __consumer_offsets topic,选择少一些或者多一些的分区数,不用理会 offsets.topic.num.partitions 的值。

提交分为自动&手动提交。自动提交时,每隔 auto.commit.interval.ms 会提交到 __consumer_offsets 中,进而可能导致 __consumer_offsets 占用磁盘较大的问题。为此,Kafka 有个 Compact 策略,删除每个 Key 的过期数据,只留最新数据,由 Log Cleaner 后台线程进行。Kafka Compact 策略

Kafka 中控制使用 Compact 策略来删除位移主题(如 __consumer_offsets 主题)中过期消息的参数是 offsets.retention.minutes。这个参数指定的是在 Compact 日志中保留数据的最长时间,单位是分钟。从 Kafka 2.8.0 开始,offsets.retention.minutes 参数已经被 offsets.retention.duration.ms 所替代。