作用

  • 0.9 之后 的 Consumer Group 将 offset 保存在 Broker 端的内部主题 __consumer_offsets
    • 将 Consumer 的位移数据作为一条条普通的 Kafka 消息,提交到 __consumer_offsets 中

创建时机

  • 当 Kafka 集群中的第一个 Consumer 程序启动时,Kafka 会自动创建位移主题
    • Broker 端参数 offsets.topic.num.partitions 设置该 topic 的分区数,默认 50
    • Broker 端参数 offsets.topic.replication.facto 设置该 topic 的副本数,默认 3

消息格式

  1. Consumer 提交位移的消息

    • 它的消息格式却是 Kafka 自己定义的,用户不能修改
      • Key 中应该保存 3 部分内容:<Group ID,主题名,分区号 >
      • 消息体就是保存了 offset
  2. 用于保存 Consumer Group 信息的消息。

    • Consumer Group 注册时使用
  3. 用于删除 Group 过期位移甚至是删除 Group 的消息。

    • 一旦某个 Consumer Group 下的所有 Consumer 实例都停止了,而且它们的位移数据都已被删除时,Kafka 会向位移主题的对应分区写入 tombstone 消息,表明要彻底删除这个 Group 的信息。
    • tombstone 消息,即墓碑消息,也称 delete mark
    • 消息体为 null

如何删除过期消息

  • Kafka 使用 Compact 策略来删除位移主题中的过期消息,避免该主题无限期膨胀。
  • 那么应该如何定义 Compact 策略中的过期呢?
    • 对于同一个 Key 的两条消息 M1 和 M2,如果 M1 的发送时间早于 M2,那么 M1 就是过期消息。
  • Compact 的过程就是扫描日志的所有消息,剔除那些过期的消息,然后把剩下的消息整理在一起。

image.png

  • Kafka 提供了专门的后台线程定期地巡检待 Compact 的主题,看看是否存在满足条件的可删除数据。这个后台线程叫 Log Cleaner
    • 避免这个线程挂掉,让 __consumer_offsets 挂掉