Kafka 压缩算法
压缩 (compression) : 用时间换空间的思想
- 用较小的 CPU 开销获得磁盘少占用或网络 I/O 少传输
Kafka 消息分两层:
- 消息日志组成 : n 个消息集合
- 消息集合 (message set) 组成 : n 条日志项 (record item)
- 日志项封装了消息 (message)
- Kafka 在消息集合层上进行写入操作
消息格式
Kafka 消息格式的引入版本 :
- V0 版本 : Kafka 0.10.0.0 前
- V1 版本 : Kafka 0.10.0.0 后引入
- V2 版本 : Kafka 0.11.0.0 后引入
V0/V1
V0 消息格式 :
- CRC 在每个消息中
- 没有时间戳
V1 消息格式 :
- CRC 依然在每个消息中
- 增加了时间戳 , 记录该消息的事件时间
- attribute 的第4位 : 时间戳类型 : CREATE_TIME (Producer 创建时间) , LOG_APPEND_TIME (Broker 写入时间)
V0/V1的消息集合格式 :
- offset : 该消息的 offset (未压缩) ; 该批消息中最后一条消息的 offset (压缩)
V0/V1的缺点 :
- 空间使用率低 : 固定 4 字节保存 key 或 value 的长度
- 消息总长度未保存 : 要实时计算总字节数
- 只保存最新消息位移 : 压缩后只保留最后一条 offset
- 冗余 CRC 校验 : 每条消息都有 CRC
V2
V2 消息格式 :
- 增加了消息总长度
- 改为可变长的时间增量 (以消息集合中的起始时间戳)
- 去除了 CRC 验证
V2 消息集合格式 :
- 增加 CRC 验证
- 增加支持幂等性及事务的 PID , producer epoch , 序列号
CRC
CRC 校验对比:
- V1 的每条消息都要执行 CRC 校验,当出现 CRC 变化时,对每条消息都执行 CRC 校验 ,会浪费空间还耽误 CPU 时间
- V2 把消息的 CRC 校验移到了消息集合层
CRC 变化情况 :
- Broker 对消息时间戳字段更新时,CRC 值会更新
- Broker 对消息格式转换时 (兼容老版本客户端),CRC 值会变化
压缩
各格式的压缩情况 :
- V1 :把多条消息进行压缩,再保存到外层消息的消息体字段中
- V2 :对整个消息集合进行压缩
V2 / V1 对比 :
压缩
压缩的地方:生产者端和 Broker 端
- Broker 从 Producer 收到消息后 ,而不会重新压缩 (有特例)
开启 GZIP 的 Producer 对象 :
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
//指定 GZIP 压缩
props.put("compression.type", "gzip");Producer<String, String> producer = new KafkaProducer<>(props);
Broker 重新压缩消息情况 :
- Broker 和 Producer 用不同的压缩算法
- Broker 发生消息格式转换
不同算法 :
- 例子 :Producer 用 GZIP; Broker 用 Snappy
- Broker 接收到 GZIP 压缩消息后,只能解压缩后,用 Snappy 重新压缩一遍
- 不同算法会引发 Broker 端 CPU 使用率飙升
消息格式转换 : 为了兼容老版本的消费者
- Broker 会对新版本消息向老版本格式的转换
- 该过程会对消息的解压缩和重新压缩
- 这种消息格式转换对性能影响很大,失去压缩,Zero Copy 特性
零拷贝 (Zero Copy) :当数据在磁盘和网络进行传输时, 避免昂贵的内核态数据拷贝,而实现快速的数据传输
解压缩
信息压缩流程:
- Producer 发送压缩消息到 Broker 后 ,Broker 原样保存
- 当 Consumer 请求消息时,Broker 原样发送过去
- 当消息到达 Consumer 后,由 Consumer 自行解压成原来消息
Consumer 用那种压缩算法:
- 压缩算法封装在消息集合中,当 Consumer 读取到消息集合时,就得知消息用哪种压缩算法
Broker 端会解压缩 (与消息格式转换不同) :
- 每个压缩过的消息集合在 Broker 写入时,会发生解压缩
- 目的:为了对消息执行各种验证,会提高 CPU 的使用率
京东说明:去掉 Broker 消息校验而引入的解压缩 ,Broker 端的 CPU 使用率减少 50% ( Kafka 2.4 后实现)
压缩算法对比
Kafka 2.1.0 前,支持 3 种压缩算法:GZIP、Snappy、LZ4
- 2.1.0 后,支持 Zstandard 算法 (zstd)
压缩算法的指标:
- 压缩比:原 100 空间压缩后占 20 空间,压缩比是 5。压缩比越高越好
- 压缩/解压缩吞吐量:每秒能压缩或解压缩多少 MB。吞吐量越高越好
压缩算法比较:
- 吞吐量:LZ4 > Snappy > zstd 和 GZIP
- 压缩比 : zstd > LZ4 > GZIP > Snappy
- 用 Snappy 占带宽最多,zstd 最少
启用压缩的时机 :
- Producer 的 机器 CPU 充足
- 带宽资源有限。当客户端机器 CPU 吊,建议用 zstd 压缩,能节省网络带宽
相关文章:

Kafka 压缩算法
压缩 (compression) : 用时间换空间的思想 用较小的 CPU 开销获得磁盘少占用或网络 I/O 少传输 Kafka 消息分两层: 消息日志组成 : n 个消息集合消息集合 (message set) 组成 : n 条日志项 (record item)日志项封装了消息 (message)Kafka 在消息集合层上进行写入…...

关于React Hook(18)
useState():👉详情 (必须“有条件地调用”;注意避免冗余状态的产生) 关于useState的两种使用方式的区别:👉详情 关于batch机制:有条件地调用一些状态的set方…...

计算机网络:BGP协议
BGP协议 与其他AS的邻站BPG发言人交换信息。 交换的网络可达性信息,即要到达某一个网络所要经历的一系列AS 发生变化时,更新有变化的部分 BGP协议交换信息的过程:所交换的网络可达性信息就是要到达某一个网络所要经历的一系列ASÿ…...

91. 解码方法 ——【Leetcode每日刷题】
91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法࿰…...

人体存在传感器成品方案,精准感知静止存在,实时智能化感控技术
随着现今智能时代的发展,酒店也越来越趋于智能化,也在不断地推行智慧酒店,这也给人们入住酒店提供了良好的体验。 人体存在感知是智能酒店中极其重要的一项应用技术,只有智能设备通过精准地感知人体存在,才能更好地做…...

mysql连接池的实现
目录 1 池化技术 2 什么是数据库连接池 3 为什么使用数据库连接池 3.1 不使用连接池 3.2 使用连接池 3.3 长连接和连接池的区别 4 数据库连接池运行机制 5 连接池和线程池的关系 6 线程池设计要点 6.1 连接池设计逻辑 构造函数 初始化 请求获取连接 归还连接 析…...

哪种类型蓝牙耳机佩戴最舒服?舒适度最好的蓝牙耳机推荐
如果您想在外出时听自己喜欢的音乐,您需要佩戴耳机,当前的耳机都足够小,可以将它们放在口袋里,即使它们在充电盒中也是如此,舒适度一直都是人们所追求的,舒适之余,佩戴同样稳固更加令人安心&…...

2020蓝桥杯真题洁净数 C语言/C++
题目描述 小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数。如果一个数的数位不包含数字 2,小明将它称为洁净数。 请问在整数 1 至 n 中,洁净数有多少个? 输入描述 输入的第一行包含一个整数 n(1≤n≤10^6)。 输出描述 输…...
【随笔二】useReducer详解及其应用场景
前言 useReducer 实际上是 useState 的升级版,都是用来存储和更新 state,只是应用的场景不一样。 一般情况下,我们使用 useState 就足够项目需要了,不多当遇到以下场景时,使用useReducer 会更好些 。 状态逻辑复杂&…...
打怪升级之istringstream介绍
istringstream类 istringstream本质不是类,是一个宏,或者说是一个流: typedef basic_istringstream<char> istringstream;istringstream从basic_istringstream的char专用项而来。这一部分让人看得摸不着头脑的原因是因为大量使用了st…...

系统重装漏洞
zzcms系统重装漏洞 一、配置zzcms环境 1. 使用小皮搭建zzcms框架 2. 安装zzcms 按照下面的操作进行,傻瓜式操作即可 3. 打开网站 二、漏洞利用 在访问install目录的默认文件后,会出现zzcms安装向导 http://www.zzcms.com/install/index.php 但是会显示 “安装向导…...

C++面向对象编程之五:友元(friend)
C中,允许一个类的非共有成员被这个类授予友元(friend)关系的全局函数,另一个类,或另一个类中的成员函数访问。友元不是一个类中的成员,所以它们不受声明出现部分的访问权限(public,p…...
[手写OS]动手实现一个OS 之X86实模式下的汇编开发
[手写OS]动手实现一个OS 之X86实模式下的汇编开发 x86实模式下 汇编开发是一个 intel x86实模式中的汇编程序开发类型。它涉及操纵几个16位处理器寄存器,并仅处理内存中的物理地址(与受保护模式相对)。 这种类型的编程中最广为人知的应用就…...

【Linux内核二】常用的网络丢包错包debug工具介绍
目录 ifconfig Ifconfig输出各字段简述 txqueuelen RX和TX的errors指哪些错误 dropped与overruns的区别 常用ifconfig配置命令 显示网卡信息 启动关闭指定网卡 配置和删除ip地址 修改MAC地址 启用和关闭ARP协议 设置最大传输单元 设置网卡的promiscuous模式 设置…...

qt控件增加渐变色效果
ui->returnBtn->setStyleSheet("color: rgb(0, 0, 0);""background:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, ""stop:0 #5f5f5f, stop:0.5 #ffffff, stop:0.98 #5f5f5f);""border:none;");效果如下图: …...

【node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 最全面有效的解决方案】
执行nodejs文件错误: 这个错误提示通常是由于你的系统无法识别 "node" 命令,可能是由于你没有正确地安装或配置 Node.js 环境变量。 问题描述 原因分析: 可能原因包括: 1.Node.js未正确安…...

打怪升级之字符串的分界符与字符串替换
流的字符串分界符 在C的iostream中,有流的字符串分界符: " “和”"都代表简单的分隔。 因此,使用流来做字符串分隔的话,有一个比较简单的方案就是将原定义的分隔符通过替换的方式变成流的分隔符。然后再录入流中就能…...
载荷台子使用方式
载荷自动测量台子使用方法 电源开关旋转到1,开启电源开启台子微机开关,开启电脑(winxp)开启台子载荷开关,启动载荷台子点击电脑动标图标,开启软件放入载荷,弹性体向上,载荷台子压头压…...
1005 继续(3n + 1)猜想
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候,我们需要计算 3、5、8、4、2、1&a…...

VMware15配置NAT模式联通网络
最近为了测试C# 开发的桌面应用程序悬浮球的兼容性,在虚拟机上安装了win7系统和xp系统,之前也安装过黑苹果系统,但是win系统倒是第一次安装,在win7系统联网的时候,踩了一些坑,整理纪录一下。 设置主物理机配…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...