Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >厉害了!一文撕开Kafka Compact Topic神秘面纱

厉害了!一文撕开Kafka Compact Topic神秘面纱

作者头像
用户9421738
发布于 2024-08-06 07:18:06
发布于 2024-08-06 07:18:06
40000
代码可运行
举报
文章被收录于专栏:大数据从业者大数据从业者
运行总次数:0
代码可运行

背景

随着平台Kafka的对接客户越来越多,我发现很多人只知道Kafka Topic可以根据设置保存大小和保存时间触发数据清理机制,但是并不熟悉Kafka Topic另一种清理策略compact。遂有此文,本文主要介绍compact原理、相关配置、实践案例操作记录、相关源码分析等内容。欢迎关注微信公众号:大数据从业者

Compact原理

Kafka数据清理策略是由log.cleanup.policy参数决定的,当前支持两种策略:delete(普通主题默认)、compact(系统主题默认)。两种策略可以同时使用,互不冲突。所以,log.cleanup.policy可以设置为delete或compact或delete,compact。本文暂不涉及delete清理策略,只讲述compact清理策略。Kafka系统主题__consumer_offsets默认清理策略就是compact。

强调一点:compact策略仅对Topic内同时携带key和value的消息有效。换句话说,如果需要使用compact策略,那么producer发送的消息需要同时携带key和value。

我们知道Topic是由Partition组成的,producer将消息写入Partition,每条消息都会被分配一个唯一且不可变的offset。如下图所示:

如果清理策略是delete,那么当满足保存大小或者保存时间的条件时,触发数据清理机制。指定offset之前的消息都将被删除,也就是Delete Retention Point之前的消息,如下图所示:

换句话说,delete策略不会考虑消息的key或value是什么,更不考虑有没有相同的Key消息存在。而compact策略则会考虑同一分区内的相同key的消息,最终只保留相同key的消息中最新的value对应的消息。如下图所示,原始数据中K1有三条消息,经过compact处理,只保留K1:V4这一条消息。个人感觉,该过程称为compact并不是很贴切,应该称为update之类的。

Compact策略适用于只想保留当前快照而不是完整修改历史的场景。比如:为了保存员工工资信息,可以创建主题employee-salary且设置compact策略,如下图所示:

Compact关键保证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.不影响没有消费延迟的consumer获取所有消息。换句话说,compact只会操作非active segment,而没有消费延迟的consumer正在消费active segment。    

2.Compact不会改变消息的offset值、key值、partition值、前后顺序。只是删除一些消息。

3.在log.cleaner.delete.retention.ms(默认24H)时间内,消费者仍能消费到待删除的消息。 

除了正常携带key和value的消息之外,compact还有一种特殊消息:key正常但value=null,这种消息称为tombstone消息。tombstone消息进行合没有意义,所以compact会删除这类消息。欢迎关注公众号:大数据从业者

Compact配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
log.cleanup.policy:清理策略(delete或compact或delete,compact)

log.cleaner.enable:是否启用compact清理任务

log.cleaner.threads:compact清理任务的线程数

log.segment.bytes:segmemnt文件的最大字节

log.segment.ms:segment保持active的最大时间

log.cleaner.backoff.ms: 清理任务闲时休眠时间

log.cleaner.min.compaction.lag.ms:触发compact的最小延迟时间

log.cleaner.max.compaction.lag.ms:触发compact的最大延迟时间

log.cleaner.dedupe.buffer.size:清理任务线程用于去重的内存

log.cleaner.delete.retention.ms:compact删除消息延迟删除时间    

log.cleaner.io.buffer.load.factor:清理任务线程 IO buffer负载率

log.cleaner.io.buffer.size:清理任务线程IO buffer内存

log.cleaner.io.max.bytes.per.second:清理任务线程IO限速

log.cleaner.min.cleanable.ratio:触发compact的脏数据比例

实践案例

1.创建测试主题

为便于测试,设置min.cleanable.dirty.ratio=0.001、segment.ms=5000以保证compact清理任务尽快执行,设置partitions=1以保证测试消息写入相同分区。

2.描述测试主题

3.启动消费者

4.启动生产者,发送测试消息

消息内容故意加入重复key,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Patrick,salary: 10000

Lucy,salary: 20000

Bob,salary: 20000

Patrick,salary: 25000

Lucy,salary: 30000

Patrick,salary: 30000

5.查看第3步消费消息

可以看到消费到所有消息,证实上文Compact关键保证之一:不影响没有消费延迟的consumer获取所有消息。

6.等待一分钟,继续生产消息,如:Stephane,salary: 0

7.启动新的消费者

可以看到,经过compact清理,上述第4步发送的重复消息只保留最新value。

源码剖析

KafkaServer.startup会启动LogManager,LogManager.startup会启动一个Schedule线程池和一个LogCleaner(内部启动CleanerThread)。Schedule线程池中有一个任务为kafka-log-retention,对应于delete清理策略;而LogCleaner对应于compact清理策略。

本文只讲述compact相关的LogCleaner,其startup方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**

   * Start the background cleaning

   */

  def startup() {

    info("Starting the log cleaner")

// cleaner线程数通过参数log.cleaner.threads配置,默认为1

    (0 until config.numThreads).foreach { i =>

      val cleaner = new CleanerThread(i)

      cleaners += cleaner

      cleaner.start()

    }

  }

接下来主要看下CleanerThread类主流程,位置在LogCleaner.scala文件。

主流程如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doWork -> cleanFilthiestLog ->  grabFilthiestCompactedLog -> cleanLog -> clean -> doClean

篇幅有限,doClean方法内容不再介绍。感兴趣请自行阅读。如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/log/LogCleaner.scala#L594

另外LogCleaner提供metric,方便问题排查和性能调优,如下所示:

总结

通过阅读本文,可以掌握compact原理、配置、实践操作、源码分析等内容。至此,Kafka Compact Topic使用与调优轻松拿捏!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据从业者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 自定义View 之 简易输入框
  在日常工作开发中,我们时长会遇到各种各样的需求,不部分需求是可以通过Android 原生的View来解决,而有一些是无法解决的,这时候我们就需要自定义View,我们先来看看本文中这个自定义View的演示效果图。
晨曦_LLW
2023/05/09
1.2K0
Android 自定义View 之 简易输入框
Android-MotionLayout动画
https://mp.weixin.qq.com/s/8DhoUK9YlbRGwr6ALp2CBw 话不多说,上图为敬:
android_薛之涛
2021/12/08
1.1K0
Android-MotionLayout动画
「Android 自定义 View」—— AreaSelectLayout
前几天写了一个小工具,其中一个设置项需要屏幕区域范围坐标参数,由于通过观察直接填写坐标信息不太现实,于是就有了通过直接拖拽屏幕去取这个参数的需求,又因为需要在任意界面都能选取,所以就想到了悬浮窗,这里以前写过一个悬浮窗工具类《FloatWindowUtils 实现及事件冲突解决详解》,想着再加一些手势及绘制应该就能实现,于是吭叽吭叽搞了半天,发现其中还是有些坑的,所以在此记录备忘。
SkyRiN
2019/03/15
6280
基于 Android Studio 音乐播放器App
点击右侧文字传送:基于 Android Studio 实现的简易 音乐播放器App_android studio音乐播放器-CSDN博客
编程乐学
2024/07/01
2450
基于 Android Studio  音乐播放器App
【目标检测】YOLOv5在Android上的部署
本篇博文用来研究YOLOv5在Android上部署的例程 主要参考的是Pytorch官方提供的Demo:https://github.com/pytorch/android-demo-app/tree/master/PyTorchDemoApp
zstar
2022/11/12
3.1K2
【目标检测】YOLOv5在Android上的部署
Android 自定义View 之 Dialog弹窗
  在日常开发中用到弹窗是比较多的,常用于提示作用,比如错误操作提示,余额不足提示,退出登录提示等,还有用于数据展示的弹窗,上拉弹窗等等,主要为了简化在日常开发中的使用。
晨曦_LLW
2023/07/10
1.2K0
Android 自定义View 之 Dialog弹窗
Android 12 蓝牙适配
  在我的申请下,公司终于购买了一台基于Android12.0的手机,然后我就开心的拿去安装测试了,发现程序崩溃了,于是我这里就写下来,Android12.0的蓝牙适配方法。
晨曦_LLW
2022/04/27
2.2K0
Android 12 蓝牙适配
再学一次ConstraintLayout 一些新特性
首先,ConstraintLayout是一个新的布局,它是直接继承自ViewGroup的,所以在兼容性方面是非常好的.官方称可以兼容到API 9.可以放心食用.
Android技术干货分享
2019/03/28
1.8K0
再学一次ConstraintLayout 一些新特性
Android入门教程 | 使用 ConstraintLayout 构建自适应界面
ConstraintLayout 可使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局。它与 RelativeLayout 相似,其中所有的视图均根据同级视图与父布局之间的关系进行布局,但其灵活性要高于 RelativeLayout,并且更易于与 Android Studio 的布局编辑器配合使用。
Android_anzi
2021/12/07
2.7K0
Android5.0新特性之——按钮点击效果动画(涟漪效果)
      涟漪效果是Android5.0以后的新特性。为了兼容性,建议新建drawable-v21文件夹来存放RippleDrawable,drawable文件夹下也要放相应的适配图片。(这里可以安装一个AndroidSelector插件,具体的可以参考https://blog.csdn.net/oqihaogongyuan/article/details/53102615的第三部分)
用户3030674
2018/09/14
4.1K0
Android5.0新特性之——按钮点击效果动画(涟漪效果)
进度条使用
ProgressBar是Android下的进度条,也是为数不多的直接继承于View类的控件.
李小白是一只喵
2020/04/23
2K0
进度条使用
【约束布局】ConstraintLayout 组件可见性 View.GONE 处理 与 Margin 属性 ( 约束布局可见性处理 | goneMargin 属性 )
当 被约束组件的某位置 ( Left, Right, Top, Bottom ) 被 约束到的目标组件可见性 ( Visibility ) 是 View.GONE 时 , 可以使用下面的属性值 , 设置一个不同的 Margin 属性值 ;
韩曙亮
2023/03/27
1.7K0
【约束布局】ConstraintLayout 组件可见性 View.GONE 处理 与 Margin 属性  ( 约束布局可见性处理 | goneMargin 属性 )
kotlin--StateFlow运用
StateFlow当值发生变化,就会将值发送出去,下流就可以接收到新值。在某些场景下,StateFlow比LiveData更适用 效果: 1.定义ViewModel StateFlow需要初始值 package com.aruba.flowapplyapplication.viewmodel import android.view.View import androidx.lifecycle.ViewModel import kotlinx.coroutines.flow.MutableStateFl
aruba
2021/12/06
6710
kotlin--StateFlow运用
自动图片播放器(AdapterViewFlipper)
AdapterViewFilpper 继承 了AdapterViewAnimator,它也会显示 Adapter 提供的多个 View 组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下一个组件。
李小白是一只喵
2020/04/24
1.2K0
【Jetpack】DataBinding 架构组件 ③ ( 使用 include 导入二级界面布局 | 二级页面绑定数据模型 )
如果在 DataBinding 布局 中 , 通过 include 引入了其它布局 , 数据模型对象 需要 绑定到 通过 include 引入的二级页面 布局文件中 ;
韩曙亮
2023/04/02
6320
【Jetpack】DataBinding 架构组件 ③ ( 使用 include 导入二级界面布局 | 二级页面绑定数据模型 )
ConstraintLayout+ViewPager2打造《摇一摇新年幸运签》App
祝各位工程师,虎年大吉,2022年心想事成,想法几经改版,差点流产,还好最后坚持做了出来。
longzeqiu
2022/01/24
1.8K0
ConstraintLayout+ViewPager2打造《摇一摇新年幸运签》App
Android RecyclerView使用简述
  RecyclerView是Android中非常受欢迎的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件,所以如果你还在使用ListView的话可以替换为RecyclerView了。
晨曦_LLW
2022/10/05
2.5K1
Android RecyclerView使用简述
强大的ConstraintLayout:使用ConstraintLayout打造响应式UI
约束布局ConstraintLayout发布(2017年)至今已经好几个年头了。经过几个版本的功能迭代,现阶段的ConstraintLayout相当强大,80%以上的复杂界面都可以使用ConstraintLayout来实现;剩下的20%里,有80%是没充分利用好ConstraintLayout的特性来实现,最后的20%,才是Android Support 包团队需要加油补上的。
Kkkiro
2019/07/19
3.1K0
ConstraintLayout使用场景必知必会
ConstraintLayout的布局优越性已经不用再强调了,通过ConstraintLayout的约束思想,可以很方便的解决一些之前需要写很复杂的动态代码才能完成的效果。
用户1907613
2021/03/01
1.3K0
1.android布局-ConstraintLayout-约束布局-例子
前言 ConstraintLayout 出来也有一段时间,虽说也有很多坑,但是一些属性还是特别好用的,在项目中我也逐渐在使用,下面是用ConstraintLayout实现的一个标签栏的样式例子。 1.android布局-ConstraintLayout-约束布局 效果 思路 1. 定义两条横向约束线(Guideline) 2. 横向排列5个控件(TextView) 3. 在每个TextView 下在来5个短横线(View) 4. 最下方放置一个ViewPager 代码 activity_tab
tea9
2022/07/16
5670
1.android布局-ConstraintLayout-约束布局-例子
推荐阅读
相关推荐
Android 自定义View 之 简易输入框
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验