【kafka实践】09|消费者位移

位移主题

前面的章节中已经多次提到消费位移了,本节内容就要深入了解下消费位移topic:__consumer_offsets(前面是两个下划线),我们也可以称其为"位移主题"

上一节有提到老版本 Consumer 的位移管理是通过ZooKeeper实现的。当 Consumer 重启时,从 ZooKeeper 中读取位移数据,继续上一次的消费。这使得 Kafka Broker 不需要保存位移数据,减少了 Broker 端需要持有的状态空间,有利于实现高伸缩性。

但ZooKeeper并不适用于这种高频写操作,因此Kafka在更新了几个版本之后,最终抛弃了位移管理机制,同时引入了**__consumer_offsets**这个内部主题。

新的位移管理机制也很简单,就是将 Consumer 的位移数据作为一条条普通的 Kafka 消息,提交到 __consumer_offsets 中。__consumer_offsets 的主要作用是保存 Kafka 消费者的位移信息。它要求这个提交过程不仅要实现高持久性,还要支持高频的写操作。Kafka本身的设计就满足这两个条件,因此使用 __consumer_offsets 主题来保存位移就水到渠成了。

位移主题并不神秘,你可以手动地创建它、修改它,甚至删除它。不过大部分情况下,不需要管理它,既然是内部主体,把它交给 Kafka就行了。

消息格式

虽然我们可以手动修改位移主题,但它的消息格式却是Kafka自己定义的,不能随便修改,也就是说不能随意地向这个主题写消息,一旦你写入的消息不满足 Kafka 规定的格式,那么 Kafka 内部无法成功解析,就会造成 Broker 的崩溃。

关于**__consumer_offsets的** 消息格式,可以简单地理解为是一个 KV 对。Key 和 Value 分别表示消息的键值和消息体,既然是存储位移那value一定和就是位移信息,那key呢,大家可以先思考一下。**位移主题的 Key 中应该保存 3 部分内容:groupId + topic信息 + partition信息,**这样就能区分具体consumer的消费情况了!

当然这只是大体的消息格式,实际上的设计比这个复杂的多,我们有个大体的概念即可,又深入了解的朋友欢迎评论区交流。

创建时机

通常当 Kafka 集群中的第一个 Consumer 程序启动时,会自动创建位移主题。位移主题就是普通的 Kafka 主题,如果是Kafka自动创建的,分区数是怎么设置的呢?这取决于Broker端参数 offsets.topic.num.partitions的取值,默认值是 50,同理副本数通过offsets.topic.replication.factor配置,它的默认值是 3。所以 Kafka 会自动创建一个 50 分区、副本为 3的位移主题。

删除过期位移

简单提一下过期位移的删除,Kafka 使用 Compact 策略来删除位移主题中的过期消息,避免该主题数据堆积过多。同时Kafka 提供了专门的后台线程(Log Cleaner)定期地巡检待 Compact 的主题,看是否存在满足条件的可删除数据。如果生产环境中出现过位移主题用过多磁盘空间的问题,可以检查下是否是该现场挂掉。

相关推荐
长安城没有风5 小时前
从入门到精通【Redis】Redis 典型应⽤ --- 分布式锁
数据库·redis·分布式
爬山算法8 小时前
Redis(69)Redis分布式锁的优点和缺点是什么?
数据库·redis·分布式
wudl556612 小时前
Flink SQL 与 Kafka 整合详细教程
sql·flink·kafka
virtuousOne14 小时前
Kafka基础
分布式·kafka
虫小宝14 小时前
Java分布式架构下的电商返利APP技术选型与架构设计实践
java·分布式·架构
007php00714 小时前
百度面试题解析:Zookeeper、ArrayList、生产者消费者模型及多线程(二)
java·分布式·zookeeper·云原生·职场和发展·eureka·java-zookeeper
waving-black15 小时前
windows系统下安装测试kafka
windows·分布式·kafka
深思慎考15 小时前
RabbitMQ 入门:基于 AMQP-CPP 的 C++ 实践指南与二次封装
开发语言·c++·分布式·rabbitmq·api
Andya_net15 小时前
Java | 基于redis实现分布式批量设置各个数据中心的服务器配置方案设计和代码实践
java·服务器·分布式
沉默终止1 天前
Kafka Queue: 完成 alterShareGroupOffsets Api
kafka