kafka位移主题
位移主题:(__consumer_offsets)它是kafka的内部主题。
介绍
上一篇文章中我们将了位移信息的存储是要区分新老版本的,在老版本中位移信息是存放在zookeeper中的,而新版本的位移信息存放在Kafka自身的位移主题中。
放在kafka自身的原因是,保存位移信息需要保证高频的写操作以及保存的持久性,但是zookeeper并不适合用于高频写操作的场景下。而kafka本身就适合用于频繁的写操作,所以正适合。
说明一下:位移主题和我们自己创建的主题一样,就是普通的kafka主题。我们可以手动的创建,修改,甚至删除它。不过,大部分情况下,我们不需要花时间去管理它,kafka会照顾好它的。
不过,尽管它是一个普通的主题,但是,它的消息格式确实kafka自己定义的。我们不能修改,也就是我们不能随意向这个主题写消息。因为一旦我们写的消息不满足kafka的格式要求,kafka就无法解析,有可能造成broker的崩溃。kafka Consumer有API帮咱们提交位移。
位移主题的key中保存的内容
位移主题的key中应该保存三部分:<Group ID,主题名,分区号>
消息体中,存储的出了位移值之外,还要保存位移提交的一些其它元数据,例如:时间戳和用户自定义的数据等。不过里面最重要的还是位移值。
消息格式里面,刚刚说的只是其中一种,还有另外两种:
1:保存Consumer Group 消息的消息。它是用来注册Consumer Group的
2:用于删除Group过期位移甚至是删除Group的消息。它是tombstone消息(墓碑消息),也称delete mark。它的主要特征是它的消息体是null,即空消息。
这种消息当某个Consumer Group下的所有Consumer实例都停止了,而且他们的位移数量都已被删除时,kafka会向位移主题的对应分区写入tombstone消息,表明要彻底删除这个Group的消息。
位移主题的创建
通常,当kafka集群中的第一个Consumer程序启动时,kafka会自动创建位移主题。如果位移主题时kafka自动创建的,那么该主题的分区数是50,副本数是3。
你也可以选择手动创建位移主题,方法是:在kafka集群尚未启动任何Consumer时,使用kafka API创建它。手动创建可以更好的适应你的业务逻辑,但是并不推荐使用。
位移的提交
位移提交的方式有两种:自动提交和手动提交。Consumer端有个参数enable.auto.commit,如果值是true,则Consumer在后台默认的为你定期提交位移,提交间隔由一个专属的参数:auto.commit.interval.ms来控制。自动提交的有点就是省事,但是并不推荐,因为这样你完全无法把控Consumer端的位移管理。
位移主题的垃圾回收。
我们知道,位移主题会有大量的写数据,并且它是实时性的数据,那他就会有很多过期的数据,那如何清理呢?它的清理使用的:Compaction(压缩或者整理)。他会通过这种方式,将能表示当前主题真实数据的数据保留,前面的过期的过程数据删除掉。例如:
kafka提供了专门的后台线程定期的检查待Compact的主题,看看是否存在满足条件的可删除数据。