欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/mq/the-secret-behind-kafka-topic-deletion/


在本文开篇中先让大家来思考一个问题,这个问题也是来源于一次真实的应用案例,案例内容的具体步骤如下:

  • step 1. 创建一个主题,假设主题名为topic-offset;
  • step 2. 创建生产者往这个主题中写入若干消息,然后关闭生产者;
  • step 3. 创建消费者消费这个主题中的消息,并将消费位移存入__consumer_offsets这个主题中(假设这里消费组的名称groupId=“group.offset”),然后关闭消费者;
  • step 4. 删除topic-offset这个主题;
  • step 5. 在step3中提交的消费位移过期时间内(Kafka中默认过期时间是1440mins,即1天)再次创建topic-offset主题,主题的所有属性均和step 1中的相同;

至此,便可以引出了笔者的问题了:如果此时再创建一个消费者,并且这个消费者设置的消费组的名称也为"group.offset",那么这个消费者是从step 3中__consumer_offsets中保存的位置开始消费还是根据消费者自身所设置的“auto.offset.reset”参数来决定开始消费的位置。

或许你对这个问题一脸懵逼,笔者先来简单讲一下消费位移的相关知识点:我们知道在旧版的消费者中会将消费位移存储在Zookeeper节点中,显然Zookeeper不适合多写的应用场景。在新版的消费者中将消费位移存储在了Kafka内部的主题__consumer_offsets中。每当消费者有消费位移提交时,会通过OffsetCommitRequest请求将所提交的位移发送给消费者所属消费组对应的组协调器GroupCoordinator中,组协调器GroupCoordinator会将消费位移存入到__consumer_offsets主题中,同时也会在内存中保留一份备份。Kafka重启之后会将__consumer_offsets中所有的消息保存到内存中,即保存到各个GroupCoordinator中来进行维护。

如此看起来__consumer_offsets中的消费位移不会丢失,也就是说在step 5之后再创建一个相同消费组下的消费者时是会获取(OffsetFetchRequest)到之前提交的位移信息的,事实是否真的如此,这里先卖个关子,我们从主题的删除过程来进行切入分析。

就以topic-offset为例,我们可以通过kafka-topics.sh脚本、KafkaAdminClient等工具来删除它,这波操作产生的最直接的结果就是在Kafka对应的Zoopeer中的/admin/delete_topics/路径下创建一个以“topic-offset”命名的实节点。KafkaController会监听/admin/delete_topics/路径下的节点变化,当监听到有节点变化时就会接过前面kafka-topics.sh脚本、KafkaAdminClient等工具的交接棒,负责接下去的具体的删除工作,对于删除“topic-offset”而言,具体的工作有如下:

  1. 删除Zookeeper中的/admin/delete_topics/topic-offset节点、/brokers/topics/topic-offset节点以及/config/topics/topic-offset节点,后两个节点和主题的元数据信息、配置信息有关,所以也要删除掉。
  2. 通知各个broker节点将主题“topic-offset”下的所有日志文件标记删除,具体可以查看Kafka日志删除那部分的细节。
  3. 通知各个broker节点中的GroupCoordinator以删除有关此主题的消费位移信息。
    前两个大家都能猜想的出来,第3个大家未必有所了解。GroupCoordinator会遍历旗下所有的消费组,然后删除有关topic-offset的分区信息,并且通过在__consumer_offsets中设置墓碑消息来删除对应的记录。

下图中__consumer_offsets主题中有关消费位移的消息格式,图中上半部分表示消息的key,里面包含version(版本信息)、group(消费组的名称)、topic(主题名称,这里就是topic-offset)以及partition(分区编号);图中下半部分表示消息的value,对于墓碑消息来说,value设置为null,由于__consumer_offsets的清理策略是compact的,这个墓碑消息最终会被清除掉。

分析到这里,我们再来回顾文中开篇的问题,相信到这里答案已经显而易见了,删除了主题之后会顺带着将主题相关的所有消费位移信息全部删除,故在step 5之后的新消费者无迹可寻,故只能按照其所配置的auto.offset.reset参数来做具体的earliest或者lateset的重置消费。

本文中涉及到的概念有GroupCoordinator、KafkaController、Kafka日志删除、Kafka协议、GroupMetadata、墓碑消息等,如果你对此一无所知或者一知半解的话,那么说明你对Kafka的认知接近为0,如何排解未知的恐慌?——扫描关注微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/mq/the-secret-behind-kafka-topic-deletion/


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


Kafka冷门知识——主题删除背后的秘密相关推荐

  1. [深度解密]媒体发稿和软文推广背后的秘密:企业应该要看的知识

    软文发稿目前已成为企业进行网络营销宣传推广的一个重要方式,但是很多企业面临着一些急需要尽快解决的问题: 1.发了那么多新闻稿,营销效果却很差 2.怎么找到一家真正一手型的上游软文发稿平台 3.发布的新 ...

  2. 后端技术:消息队列MQ/JMS/Kafka相关知识介绍

    ?今天给大家分享消息队列MQ/JMS/Kafka相关知识介绍 1.消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把我们的快递送到我们的手里.他需要什么条件嗯? 快递小哥有时间送, 我们有时 ...

  3. kafka专题:kafka的Topic主题、Partition分区、消费组偏移量offset等基本概念详解

    文章目录 1. kafka集群整体架构 2. kafka相关元素的基本概念 2.1 主题Topic和分区Partition 2.2 kafka消息存储在哪里? 2.3 分区副本 2.4 消费组和偏移量 ...

  4. 网络安全- 专访丨互联网安全城市巡回赛冠军肖策:“大满贯”背后的秘密

    导语:你所看到的让人欣羡的荣耀时刻,是背后无数个日夜的辛苦付出! 在2019互联网安全城市巡回赛·西安站中,有一个白帽子拿下了8家大满贯,这位大神就是[火石计划杯]精英白帽挑战赛的第一名:Reckfu ...

  5. JavaScript冷门知识

    JavaScript冷门知识 看红宝书,重新梳理JavaScript的知识.这部分主要是梳理冷门的知识点(对个人来说是冷门的) 组成 ECMAScript(核心):提供核心功能.每门语言的根本,大同小 ...

  6. python 冷门知识点_Python中的10条冷门知识

    下面时Python中一些不常见的冷门知识,感兴趣的小伙伴不妨来学习一下. 1.省略号也是对象 - 这是省略号,在Python中,一切皆对象.它也不例外.在 Python 中,它叫做 Ellipsis ...

  7. Python冷门知识

    本文搜集整理网上和自己遇到的Python冷门知识.持续更新 内容整理自程序猿.Python编程时光 1.省略号也是对象 - 这是省略号,在Python中,一切皆对象.它也不例外.在 Python 中, ...

  8. 抢占智能家居入口,中兴智能锁众筹2200多万背后的秘密是什么?

    ▲中兴智能家居产品总监彭凯先生 撰稿|本刊编辑  吴哲     图片|中兴提供 如果,有这么一套智能家居系统,其中包含智能锁.路由器.家用摄像头等多个智能单品.当有不法分子试图暴力或是技术开启智能锁时 ...

  9. 爆料:我的「盐值」狂掉 100 分与其背后的秘密

    loonggg 读完需要 5 分钟 速读仅需 2 分钟 大家好,我是校长. 本来就不帅的我,知乎盐值前一段时间被官方疯狂扣掉 100 分,就在前几天我发现了知乎盐值被扣这件事背后的秘密. 01 什么是 ...

最新文章

  1. AI 助力金融后,中美金融科技领域最大的差距是什么?
  2. EPSON机器人的以太网通讯简单总结
  3. 小心了!这18位数字一泄漏,支付宝账户就可能会被他人盗刷!
  4. c语言学习-判断一个数的正、负,输出相应信息
  5. hua ge ju hao
  6. Qt之控件资源标识的含义
  7. LINUX编译Android doubango
  8. jQuery+bootstrap实现美化警告/确认/提示对话框插件
  9. 成人高考计算机基础历年真题,成人高考历年真题及答案
  10. Edraw Max(亿图图示):新手如何快速美化思维导图?
  11. FDDB评估工具使用
  12. C语言求阶乘与阶乘和
  13. css动画设置运动轨迹,css3动画之圆形运动轨迹
  14. 小米手机 加载桌面 失败 黑屏
  15. 网页在PC 上运行正常,在IPad上运行出错的故障原因分析及应对措施
  16. Mgo统计查询及显示附加字段
  17. C#:图标生成小工具
  18. 数字图像处理知识点梳理——第八章 图像压缩
  19. 第9章 虚拟专用网 技术原理与应用
  20. HDU3785寻找大富翁~~真真切切的水题

热门文章

  1. Netty--Reactor模式
  2. python一共有多少个内置函数_Python 35个内置函数,你都ok吗?
  3. 中文问好_直击/泷泽秀明秘访台!Hey! Say! JUMP也来了 亲切秀中文问好
  4. ScrollView(RecyclerView等)为什么会自动滚动原理分析,还有阻止自动滑动的解决方...
  5. mongo数据库单节点搭建
  6. kubernetes学习笔记 (二):k8s初体验
  7. 提高阅读源代码的效率 转
  8. 浅析Windows7的睡眠、休眠、混合睡眠、离开模式
  9. 常见问题kernel调优
  10. hdu 2196(树的最长链)